Java Hibernate自引用关系外键约束问题

Java Hibernate自引用关系外键约束问题,java,hibernate,spring-boot,Java,Hibernate,Spring Boot,我正在设置一个SpringBootAPI,它使用hibernate与数据库通信。我有一个用户表,每个用户都应该能够跟踪其他用户。我没有使用hibernate的经验,所以过了一段时间,我得到了一些似乎有效的东西,只是如果某个用户被其他用户跟踪,我不能删除该用户。这是因为外键约束 这就是用户的样子: @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(unique = true) @JsonP

我正在设置一个SpringBootAPI,它使用hibernate与数据库通信。我有一个用户表,每个用户都应该能够跟踪其他用户。我没有使用hibernate的经验,所以过了一段时间,我得到了一些似乎有效的东西,只是如果某个用户被其他用户跟踪,我不能删除该用户。这是因为外键约束

这就是用户的样子:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true)
    @JsonProperty
    private int id;

    @Column(unique = true)
    @JsonProperty
    private String email;

    @Column
    @JsonProperty
    private String hashedSaltedPassword;

    @Column
    @JsonProperty
    private String salt;

    @Column
    @JsonProperty
    private String firstName;

    @Column
    @JsonProperty
    private String lastName;

    @JsonProperty
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "User_Follows", schema = "todo", joinColumns=@JoinColumn(name="user_id"))
    private List<User> follows;
这不应该发生,我想要的是,每当用户被删除时,都会删除User_follow表中存在userId的所有行


有解决方法吗?

有两种方法可以实现您的目标

  • 使用另一个字段定义一个
    mappedBy
    属性,让hibernate知道整个关系,例如:
@ManyToMany(targetEntity=User.class,mappedBy=“follows”)
private List followers=new ArrayList();
你可以看看

  • 或者,您可以在用户类中创建一个
    @PreRemove
    方法,手动删除用户的所有引用:
@PreRemove
私有void removeFromFollowers(){
for(用户:追随者){
user.removeFollowed(此);
}
}

与您的问题无关,但通常哈希/加盐/密码和盐不应离开数据库。您可能会很快向不应该使用密码的用户显示密码(尽管是散列的),特别是如果您将其导出为JSON。@Guillaume密码确实没有离开数据库,我只是忘记删除JSON注释,但是salt会,因为登录时需要在客户端散列密码。我通过在删除用户之前执行以下语句修复了此问题:从[todo].[user\U Follows]中删除[todo].[user\U Follows].[Follows\U id]=:id;这是可行的,但是我无法想象你应该如何使用hibernate,所以如果有人知道一个干净的解决方案,请发布它,谢谢!
The DELETE statement conflicted with the REFERENCE constraint "FKc38v25qxktm9b0r7lg1s2t1tl". The conflict occurred in database "dbi390100_db", table "todo.User_Follows", column 'follows_id'.