【发布时间】:2011-05-12 00:08:23
【问题描述】:
我只是不明白为什么 Hibernate 会抛出标题中提到的异常。我可能不太了解 Hibernate 背后的状态管理思想。
我有以下情况:
组织和员工之间的一对多关系
组织.hmb.xml
<set name="employees" inverse="true" cascade="save-update">
<key column="organization_id"/>
<one-to-many class="Employee"/>
</set>
Employee.hbm.xml
<many-to-one name="organization" class="Organization" column="organization_id" />
我将标准 Spring/Hibernate 应用架构与服务和 DAO 一起使用,其中 DAO 扩展了 HibernateDaoSupport 类并使用 HibernateTemplate 类的服务进行会话管理。
当我尝试在这种情况下删除员工时......
Employee e=employeeService.read(1);
//EDIT: Important! delete operation in EmployeeService is (@)transactional
employeeService.delete(e); //this call just delegate execution to employeeDao.delete
编辑:我一开始没有提到服务层中的删除操作是事务性的,这似乎是重要的信息(继续阅读)!
休眠抛出...
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 中到 Employee(s) 的关系映射中删除 cascade="save-update" 时,一切正常。
2. 当我从删除方法中删除 @Transactional 注释时,一切正常。
3. 当我从孩子的父母(组织)列表中删除孩子(员工)时,然后执行删除,一切正常。
问题:
为什么 Hibernate 完全关心父类中的级联?
他考虑对组织对象进行级联的执行点在哪里?
为什么他不能用 DELETE FROM 删除 Employee(Child)... 就是这样。此外,Employee 是关系的所有者,对他执行的操作应该管理关系本身。 当他想在提到的场景中调用组织对象上的任何操作时?我只是不明白。
【问题讨论】:
标签: hibernate one-to-many