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

如果级联,则级联删除不起作用。持续和级联。删除Hibernet中父实体中一起使用的内容

简俊楚
2023-03-14

我有一个如下所示的表关系,我正在尝试级联持久性和从Entity2(表2)中删除,这意味着从表2中删除记录应该删除表3中的条目,并在表2中保存数据,同时将表3中的相关数据持久化。

                     oneToMany                       oneToMany 

表1(实体1)(母公司)--------

             oneToMany                          oneToMany

表1(父级)--------

表1是表2和表4的共同父级

1)如果我使用CascadeType. REMOVE在Entity1和{CascadeType. PERSIST, CascadeType. REMOVE}在它的子级(Entity2和Entity4)中,那么保存表2中的记录并从表2中删除记录将级联到它的子级Entity3(table3),但是将记录保存到表1不会级联到它的子级(表2和表4),因为我没有在Entity1中使用cascade.persist

2) 如果我在Entity1中使用{CascadeType.PERSIST,CascadeType.REMOVE},在其子项(Entity2和Entity4)中使用{CascadeType.PERSIST,CascadeType.REMOVE},则在表2中保存记录会被级联到其子项Entity3(表3),但在尝试从表2中删除记录时不会被删除,也不会被级联到其子项Entity3(表3),没有例外任何一个(从日志中没有执行删除查询,但在第一种情况下,我可以看到正在执行删除查询)

你能帮我找出哪里出了问题吗。。。。为什么要添加CascadeType。持久化到Entity1(表1)将对从表2中删除记录产生影响?

表1{

....

@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE,mappedBy=....})
public Set<Table2> getTable2() {
return table2;
}

}

表2{

....

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(....)
public Table1 getTable1() {
return table1 
}


@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE,mappedBy=....})
public Set<Table3> getTable3() {
    return table3;
}

}

表3{

....

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(....)
public Table2 getTable2() {
    return table2;

}

}

共有2个答案

阎晔
2023-03-14

很可能您正在手动尝试删除Table2的一个实例,而不清理引用,因此Table1的实例仍在引用已删除的Table2实例。映射上的cascade persist选项将使其重新插入-取消remove函数。

您需要清理对要删除的对象的引用,因为JPA不会为您这样做,如果不这样做,缓存将与数据库不同步。当您尝试删除Table2的实例时,还需要将其从Table1的列表中删除。

梁明辉
2023-03-14

这篇文章似乎准确地描述了您的问题。如果作者所说的仍然是真的(这篇文章来自2010年),那么问题在于JPA和Hibernate在持久化时所期望的操作之间不匹配。如果您使用的是较旧的Hibernate实现,我会首先尝试升级到较新的版本,因为我在最近的版本中从未见过这个问题。如果您无法升级(例如,您必须使用应用服务器提供的Hibernate版本)或升级不起作用,用Hibernate级联注释替换JPA级联注释可能会解决您的问题。使用Hibernate注释并不是一个很好的解决方案,因为现在您的代码并不与实现无关,但如果它起作用,它就会起作用。

您使用的是什么版本的Hibernate/JPA/app server?

 类似资料:
  • 我无法使用Hibernate JPA嵌入使cascase删除在Java EE容器管理的应用程序中工作。我们将不胜感激。我有一个实体‘公司',与其他实体有四个任何关系。当测试应用程序(使用Arquillian框架)时,我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。我读到了这里:JPA和Hibernate Cascade DELETE OneToMany不起作用,这可能是一个测试问题,所

  • 代码: 三个问题: > 我必须放置<code>CascadeType吗。在两个实体中删除?我希望它能正常工作,这样如果我删除了老师,课程就会自动删除。 在我的数据库中,我的id无法正常工作。我希望它使id每次增加一个,但它目前增加了一些随机数。为什么呢? 我还有两个类,但有关系。当我想在数据库中持久化一个新对象时,我必须做什么?

  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or

  • 我一直在阅读一篇又一篇的帖子和文章,试图让级联删除在最新的Spring Boot版本中与JPA/Hibernate配合使用。我读过你必须使用Hibernate特定的级联,我读过你不需要。我读过它们就是不起作用,但它似乎是一个混合体。我尝试过的一切都不起作用。这种关系是双向的。 不工作: 不工作: 在删除品牌之前,除了删除税率之外,还有什么其他方法有效吗? 我的测试如下所示: 参考错误: 原因:or

  • 我有两个实体业务,由一个部门列表组成。 当我尝试删除一个业务实例时,我得到一个Mysql异常 无法删除或更新父行:外键约束失败(

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下: