我有 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 接口。