Spring删除联接表行

时间:2020-09-27 03:40:07

标签: mysql jpa spring-data-jpa

我有两个实体用户:

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)参考userIDusers))

我该如何解决?

1 个答案:

答案 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进行的查询,具体取决于您-工作。但是我强烈建议您重新考虑数据库结构-仅存储一个实体并不是一件容易的事。