gpt4 book ai didi

hibernate - 删除一对多关系中的子项抛出 ObjectDeletedException

转载 作者:行者123 更新时间:2023-12-03 14:15:13 26 4
gpt4 key购买 nike

我只是不明白为什么 Hibernate 会抛出标题中提到的异常。我可能不了解 Hibernate 背后的状态管理思想。

我有以下情况:

组织与员工的一对多关系

组织.hmb.xml

<set name="employees" inverse="true" cascade="save-update">  
<key column="organization_id"/>
<one-to-many class="Employee"/>
</set>

员工.hbm.xml
<many-to-one name="organization" class="Organization"  column="organization_id" />

我将标准 Spring/Hibernate 应用程序架构与服务和 DAO 一起使用,其中 DAO 扩展了 HibernateDaoSupport 类并使用 HibernateTemplate 类的服务进行 session 管理。

当我尝试在这种情况下删除 Employee 时...
Employee e=employeeService.read(1); 

//EDIT: Important! delete operation in EmployeeService is (@)transactional
employeeService.delete(e); //this call just delegate execution to employeeDao.delete

编辑 : 一开始没提到Service层的delete操作是事务性的,这似乎是重要的信息(继续阅读)!

hibernate 抛出...
 ObjectDeletedException: deleted object would be re-saved by cascade...

EmployeeService 中的删除操作看起来像...
  @Transactional public void delete(Employee emp){  
Employee e=employeeDao.read(emp.getId());
if(e==null)
throw NoSuchOrganizationException();

/*...several while-s to delete relations where Employee is
not owner of relation... */

employeeDao.delete(e);
}

场景(它们不相关):
1. 当我删除级联=“保存更新”时从关系映射到 Organization.hbm.xml 中的员工, 一切正常 .
2. 当我删除@Transactional 来自删除方法的注释一切正常。
3. 当我从 child 的父(组织)列表中删除 child (员工)时 ,然后执行删除,一切正常。

问题 :

为什么 Hibernate 完全关心父类中的级联 ?
他认为组织对象级联的执行点在哪里 ?
为什么他不能用 DELETE FROM... 删除 Employee(Child) ,就是这样。此外,Employee 是关系的所有者,对他执行的操作应该管理关系本身。 当他想在上述场景中对组织对象进行任何操作时 ?我只是不明白。

最佳答案

您可能缺少的是 Hibernate 会自动维护已加载并存在于 Session 中的实体的状态,这意味着它将保留对它们所做的任何更改 不管是否显式调用“update()”方法。

考虑到您的情况,如果您已加载 Organization和它的 employees设置并正在尝试删除其中一名员工,Hibernate 告诉您(通过抛出 ObjectDeletedException )它将在保存 Organization 时重新保存已删除的员工。因为您已经声明保存或更新应该从组织向下级联到其集合中的员工。

处理此问题的正确方法是将所述员工从组织的 employees 中删除。在删除之前设置,从而防止级联重新保存。

编辑(基于更新的问题):
Organization 拥有 员工的集合。 Cascade 始终遵循关联 - 您已在 Organization 上声明它侧,因此更改(保存/更新)向下传播到 Employee等级。只要特别Employee实例是 employees 的成员任意收藏 Organization session 中的实体,当 session 被刷新/关闭时,它将被保存(或重新保存,因此抛出异常)。

关联映射自 Employee 的事实侧(例如 organization_id 列位于 Employee 表中)在此处无关紧要;它可以通过连接表进行映射,结果相同。 Hibernate 通过 session 和当您尝试删除时保持“状态”Employee无需将其从 Organization.employees 中删除你给了 Hibernate 冲突的指令(因为它仍然存在 - 并且必须保存 - 在一个地方但在另一个地方被删除),因此异常(exception)。

关于hibernate - 删除一对多关系中的子项抛出 ObjectDeletedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5971966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com