当前位置: 首页 > 知识库问答 >
问题:

JPA:删除具有JoinTable的OneToMany关系的所有实体

欧阳洲
2023-03-14

在我的Spring/MySql系统中,我有一些Jpa实体,它们通过父关系上的joinTable在OneToMany关系中连接。在这种情况下,一个帖子有很多评论。

@Data
@Entity
@Table(name = "post")
public class Post implements Serializable {

    @Id
    @Column(name = "post_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
    @JoinTable(
            name = "post_comments",
            joinColumns = @JoinColumn(name = "post_id"),
            inverseJoinColumns = @JoinColumn(name = "comment_id")
    )
    @OrderBy("date ASC")
    private List<Comment> scores = new ArrayList<>();
}

@Entity
@Table(name = "comment")
@EqualsAndHashCode(of = {"id","date","value"},callSuper = false)
public class Comment implements Serializable {

    @Id
    @Column(name = "comment_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "date")
    private LocalDate date;

    @Column(name = "value")
    private String value;
}

如果我尝试删除Post实体,问题是生成的SQL试图删除仍在连接表中的注释,从而触发外键冲突。

org.springframework.dao.DataIntegrityViolationException: could not execute batch; SQL [delete from comment where comment_id=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute batch
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:296)
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`ci_cadreon_reach_optimization`.`post_comments`, CONSTRAINT `fk_post_comments_comment_id` FOREIGN KEY (`comment_id`) REFERENCES `comment` (`comment_id`) ON DELETE RESTRICT ON UPDAT)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

什么是正确的方法:

  1. 删除连接表项
  2. 删除连接表左侧父关系实体
  3. 删除连接表右侧子关系实体

要记住的一些事情:

  1. 还有其他实体通过oneTo多项关系拥有注释,但是注释在实体之间不共享。
  2. 这就是为什么关系是通过连接表建立的,而不是把帖子的ID直接放在评论上。

我将尝试从Post端的集合中删除注释,然后保存,以查看这是否是一种解决方法,但如果可能的话,我希望通过JPA配置将其自动化。

共有1个答案

麻和雅
2023-03-14

调用post.get评论()。清除(),保存帖子,然后删除帖子是为我工作的过程(请让我知道如果有更好的方法!)。

我认为,当存在@JoinTable时,告诉Hibernate先删除连接表条目,然后删除实体的唯一方法是从列表中删除元素并保存该操作。

然后,可以通过Cascade或手动单独删除父子项。

 类似资料:
  • 在使用Hibernate删除与子实体具有关系的JPA实体时,我遇到了一个问题,但是在使用EclipseLink而不是Hibernate作为JPA提供程序时,相同的代码可以正常工作。父实体上的批注是 当使用Hibernate时,它尝试将子实体上的join列设置为null,但由于该列不允许null而失败。使用EclipseLink时,它首先删除子实体,然后删除父实体,这是所需的行为。 我的问题是: 为

  • 我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。

  • 我有2个实体(我删除了无用的字段): 而且 这似乎符合我的情况(也是我当前的实现),但它不起作用。 我得到以下错误消息: 来自MySQL: 临时解决方案是从存储库中检索所有相应的权限(按permissionName搜索)。那么保存效果很好。逻辑上是正确的,但我希望有一个更简单的程序...

  • 我的两个实体有一对一的关系 我尝试通过此方法删除我的用户实体 PasswordResetTokenRepository类,我在服务方法中调用了该类,用于删除用户,我使用了常规Hibernate方法deleteById(Long id) 但是当我尝试通过此方法删除时,出现此错误:not-null 属性引用 null 或瞬态值:kpi.diploma.ovcharenko.entity.user.Pa

  • 我正在用Java、Spring和JPA开发一个web应用程序。我有这两个实体,它们代表一个用户及其后续通知。当一个用户跟踪另一个用户时,被跟踪的用户将收到一个follow通知。 我想删除User并删除它的所有通知,但我想保留通知的引用用户,也就是开始跟踪主用户的用户。唯一的问题是,当我尝试删除用户时,会出现以下错误: com.mysql.jdbc.exceptions.jdbc4.mysqlint

  • 问题内容: 在一个模型中,我有这个: 如果我选择: 有用。 如何从关系中删除所有对象?不管用。 问题答案: 首先,你需要使用或来清除关系,根据docs,哪种更适合你的需求。 之后,你需要使用删除对象。方法。