JPA:如何从其他表中删除用户和所有引用?

时间:2018-01-26 16:17:03

标签: postgresql hibernate jpa sql-delete cascade

当我从users表中删除用户时,他的所有posts和任何comments也应该被删除。

该模型如下所示:

@Data
@Entity @Table(name = "users")
public class BlogUser {

    @Id
    private String userName;
    private String password;
    private String email;

    @Enumerated(EnumType.STRING)
    private Role role;

    private boolean enabled;
}

post实例引用了所属用户:

@Data
@Entity @Table(name = "posts")
public class Post {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String postText;

    @ManyToOne(cascade = CascadeType.ALL)
    private BlogUser user;

    private LocalDateTime createdDate;
}

同样的情况适用于评论。

现在,当我想执行删除时,我收到此错误:

  

org.postgresql.util.PSQLException:错误:表“用户”上的更新或删除违反了表“帖子”上的外键约束“fkqdk379brhxkbj4c8qenbuu85l”

DB是Postgres。我试图使用@ManyToOne(cascade = CascadeType.ALL),但它没有帮助。

更新

我的想法是我想保留表的当前架构 不向BlogUser类添加帖子和/或评论。

2 个答案:

答案 0 :(得分:2)

您的问题很可能是因为您没有在表上声明ON CASCADE。基本上你需要放弃你的用户/帖子之间的id约束&发布/评论并重新创建,最后添加ON CASDADE DELETEThis应该帮助你。

或者,如果您不想这样做,您显然可以删除您的用户ID与您想要的匹配的帖子/评论,然后删除所述用户。如果您更喜欢这种解决方案,This也可以为您提供帮助。

答案 1 :(得分:2)

您还需要向BlogUser方添加级联,以便将其删除以级联到Post& Comment

在您的BlogUser课程中添加以下内容:

@Getter
@OneToMany(cascade=CascadeType.ALL, mappedBy="user")
private Collection<Post> posts = new HashSet<>();

@Getter
@OneToMany(cascade=CascadeType.ALL, mappedBy="user")
private Collection<Comment> comments = new HashSet<>();