关于hibernate级联的一点总结

来源:互联网 发布:ps4模拟windows 编辑:程序博客网 时间:2024/06/06 00:31
今天在遇到一个问题,当我想通过hibernate删除某个对象时总是报错

809128 [http-8080-3] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

各方查找众说纷纭,有的说是这个类设置了自动增加的主键,也有说主键id用的int应该使用integer,因为两者的初始值不一样,还有说是某个值应该为空,结果在删除的时候改制被删除了不是空值;不是持久化对象等。最后各种尝试,其实是一对多,我先删了多方,再来删一方导致的,正确的做法直接删除一方就可同时删除一方和多方两者的对象。

如下所示:

  1. public class Depart {  
  2.     private int id;  
  3.     private String name;   
  4.     private Set<Employee> employees;  //一端执有多端的一个集合引用  
  5. }  
  6. public class Employee{
  7.     private int id;
  8.     private String name;
  9.     private String add;
  10.     private Depart depart;
  11. }

Depart配置中
  1. <set name="employees" inverse="true"  cascade="all-delete-orphan" >  
  2. <key column="dept_id"/>  
  3. <one-to-many class="com.liuc.domain.Employee" />  
  4. </set>  
Employee配置中
  1. <many-to-one name="dept" column="dept_id" not-null="true" foreign-key="fk_emp_dept"/>  
  2. </class>  

这样就设置好了一对多的级联关系
在删除一个部门是就能将整个部门的人都删去。。
当然这里涉及到

即删除一的一方会将相应的多的一方也全部删掉,不需在单独删除多的一方的对象,当然这里需要设置级联关系为cascade="delete-orphan  all"  



0 0