Hibernate中的级联

    技术2026-04-04  1

    Hibernate级联和关系维护:static Department add(){ Session s=null; Transaction tran=null; try{ Department depart1=new Department(); depart1.setName("depart name1"); Employee emp1=new Employee(); emp1.setDepart(depart1);//对象模型:建立两个对象的关联 emp1.setName("employee name1"); Employee emp2=new Employee(); emp2.setDepart(depart1);//对象模型:建立两个对象的关联 emp2.setName("employee name2"); Set<Employee> emps=new Set<Employee>(); depart1.setEmps(emps); s=HibernateUtil.getSession(); tran=s.beginTransaction(); s.save(depart1); s.save(emp1); s.save(emp1); tran.commit(); return depart1; }catch(HibernateException e){ if(tran!=null){ tran.rollback(); } throw e; }finally{ if(s!=null){ s.close(); } } }

    以上面的代码为例说明:有两个类,Employee员工类,Department部门类很明显员工是属于部门类,因此Employee中含有Department的属性,来表示员工的部门信息以部门为参照,两表的关系是一对多,当执行上面的方法(用来保存员工)时候,要创建一个部门对象依照上面的方法,员工以Set集合的方法赋给部门的属性了,一般认为应该是只用保存部门就可以把两个员工信息保存进数据库了,但是程序运行结果却没有保存Department类中的Set<Employee>类型的employee属性,为什么?它能把员工的id,name属性保存下来,但是没有把employee(Set<Employee>类型)属性保存解释:Hibernate在保存数据的时候默认情况下不会把有关联的属性保存起来,而employee属性就是Department和Employee类关联的属性,因此在默认情况下,没有保存这是一种缺省的行为,这种行为是可以修改的,可以在映射文件中配置级联就可以了下面是Department部门类的映射文件,可以这样配置一下employee属性:<set name="emps" cascade="save-update"> <key column="depart_id"/> <one-to-many class="Employee"/> </set>

    标签说明:Cascade:用来说明当主对象进行某种操作时是否对其级联的从对象也进行类似的操作,常用的cascade值有: none  缺省值,就是不会进行类似的操作 all   所有的,就是对所有的操作都要进行级联操作 save-update 保存和更新级联 delete-orphan(one-to-many) 删除级联  拿部门和员工说明,如果把某一个部门的信息删除或修改为空, 那么他相对应的从属的所有员工信息也会被删除 delete lock refresh evict replicate persist merge

    级联要根据业务需求,一般many-to-many,many-to-one关系中不配置级联,在one-to-one,one-to-many设置级联,慎用!

     

    最新回复(0)