我有两个实体用户:
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long userID;
@Column(name = "userHashedPassword")
private String password;
@Column(name = "userName")
private String userName;
@Column(name = "userEmail")
private String email;
@Transient
private List<String> groups = new LinkedList<>();
@ManyToMany
@JoinTable(name = "UserRoles",
joinColumns = @JoinColumn(
name = "userID"),
inverseJoinColumns = @JoinColumn(
name = "roleID"))
private Set<Role> roles = new HashSet<>();
@OneToMany(mappedBy = "user")
private Set<Rating> ratings;
protected User(){}
public User(String userHashedPassword, String userName, String email, Set<Role> roles){
this.password = userHashedPassword;
this.userName = userName;
this.email = email;
this.roles = roles;
}
//getters and setters
}
并分组:
@Table(name="FocusGroups")
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
property = "groupID")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long groupID;
private String groupName;
@ManyToMany
@JoinTable(name = "GroupMembers",
joinColumns = @JoinColumn(
name = "groupID"),
inverseJoinColumns = @JoinColumn(
name = "userID"))
private Set<User> groupMembers = new HashSet<>();
@ManyToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(name="frameworkID", nullable = true)
private Framework framework;
public Group(){}
public Group(String groupName, Set<User> groupMembers, Framework framework) {
this.groupName = groupName;
this.groupMembers = groupMembers;
this.framework = framework;
}
//getters setters
}
删除用户时,我想将其从组成员中删除,但是由于外键约束而失败:java.sql.SQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败({{1 }}。capripol
,约束groupmembers
外键(FK98tbu0sjfsn1m5p340dn0v8wo
)参考userID
(users
))
我该如何解决?
答案 0 :(得分:0)
好吧,我将尝试回答:首先,您在用户组中引用它是很奇怪的 这样的实体:
@Transient
private List<String> groups = new LinkedList<>();
在这种情况下,数据库的用户表中将没有列组,因此必须首先对所有组从group_members中删除:
delete from group_members where userid = <user_id_you_want_to_remove>;
并且只有在JoinTable表不包含具有
delete from users where userid = 1;
注意:不必通过spring数据(例如 deleteById(Long id))并使用@Query注释指定上面用SQL或HQL进行的查询,具体取决于您-工作。但是我强烈建议您重新考虑数据库结构-仅存储一个实体并不是一件容易的事。