关于外键约束的问题

时间:2021-07-08 14:06:58

标签: java spring hibernate

我有 3 个实体 Role、Users 和 UserAssignedRoles。我分别在 Users 和 UserAssignedRoles 以及 Roles 和 UserAssigned Roles 之间有 OneToMany 双向关系。 在启动 spring boot 应用程序时,它抛出一个错误

<块引用>

java.sql.SQLIntegrityConstraintViolationException: 无法添加或更新子行:外键约束失败 (examserver.user_assigned_roles, CONSTRAINT FKkh4a308jmt2dwrbmohjlsxbrd FOREIGN KEY (role_fk)参考文献 roles (role_id))>

谁能帮我指出我做错的地方。 实体代码如下。 用户.java

package com.examserver.entities;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Table(name = "USERS")
@Entity
@Getter
@Setter
@AllArgsConstructor
public class Users implements UserDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;
    @Column(name = "first_name")
    private String fname;
    @Column(name = "last_name")
    private String lname;
    @Column(name = "user_name")
    private String username;
    @Column(name = "Email")
    private String email;
    @Column(name = "Password")
    private String password;
    @Column(name = "Is_Profile_Active")

    private boolean active = true;

    @Column(name = "Contact_Number")
    private String phoneNo;
    @Column(name = "User_Description")
    private String about;
    @Column(name = "Profile_Image")
    private String dp;



    @OneToMany(mappedBy = "user",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JsonIgnore
    Set<UserAssignedRoles> usersList = new HashSet<>();

    public Set<UserAssignedRoles> getUsersList() {
        return usersList;
    }

    public void setUsersList(Set<UserAssignedRoles> usersList) {
        this.usersList = usersList;
    }

    public Users() {
    }
    @Override
    public int hashCode() {
        return super.hashCode();
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Set<Authority> set = new HashSet<>();
        this.usersList.forEach(userAssignedRoles ->
                set.add(new Authority(userAssignedRoles.getRole().getRoleName())));

        return set;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

和Role.java

package com.examserver.entities;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.Set;

@Table(name = "ROLES")
@Entity
@Setter
@Getter
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Role_Id")
    private int roleId;

    @Column(name = "Role_Name")
    private String roleName;

    @OneToMany(mappedBy = "role",fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<UserAssignedRoles> userAssignedRolesSet;

    public Set<UserAssignedRoles> getUserAssignedRolesSet() {
        return userAssignedRolesSet;
    }

    public void setUserAssignedRolesSet(Set<UserAssignedRoles> userAssignedRolesSet) {
        this.userAssignedRolesSet = userAssignedRolesSet;
    }

    public Role(){

    }

    public Role(int roleId, String roleName, Set<UserAssignedRoles> userAssignedRolesSet) {
        this.roleId = roleId;
        this.roleName = roleName;
        this.userAssignedRolesSet = userAssignedRolesSet;
    }
}

和 UserAssignedRoles.java

package com.examserver.entities;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.List;

@Table(name = "USER_ASSIGNED_ROLES")
@Entity
@Getter
@Setter
public class UserAssignedRoles {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int userRoleId;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name ="Role_FK")
    private Role role;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "User_FK")
    private Users user;


}

PS:我使用的是 Spring Security,所以我实现了 User 实体的 Userdetails 接口。

0 个答案:

没有答案