注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

周响 廊坊师范学院九期信息技术提高班

一个世界有你 一个世界没有你 让两者的不同最大 就是你一生的意义

 
 
 

日志

 
 

Hibernate 级联操作  

2014-08-30 19:44:10|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        不借助像Hibernate这样的ORM持久化框架的情况下,我们需要先查出要修改的一个班的班级信息然后把班级信息作为条件去更新学生信息。如 SQL update T_Student ("age")values("12") where classid="1"。把像这样的sql语句封装到一个方法中,从面像对象的角度来说并不能很大程度上复用。这条sql语句中动态要变的地方有两个一个是要修改的字段和值,一个是修改的范围。也就是说我们可以通过数组或集合来动态决定要修改的字段和值,但条件范围确是很难确定。
        在Hibernate中批量更新的情况往往出现在在对集合的处理时,如批量修改一个班的学生信息时,Hibernate首先帮我们确定一个班级范围,然后会自动关联上相应的学生信息,这样当我们修改与班级信息相关联的部分学生信息时,我们只需要保存班级实体信息,Hibernate会自动将我们修改的学生实体信息保存到数据库中。说白了,Hibernate将我们的操纵分为了两步,第一步将班级条件确定查询一个班级实体,与此同时还将与该班级关联的学生信息一并查了出来。第二部当我们修改学生信息时Hibernate不再是像我们往常一样去单独操作(修改、更新)学生实体,而是在班级集合这个环境中去操作响应的学生实体信息,进而再去持久化班级信息(同时也检测有变化的学生实体信息,以便持久化班级信息的同时持久化学生信息),最终达到批量更新的目的。
       不仅仅是批量更新,批量添加、批量删除也是如此。

一、批量更新
       Hibernate中配置关联批量更新,只需要我们在关系映射配置文件中,在set 标签中将  cascade设置为save-update,如
      
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Class" table="class" lazy="true">
       <id name="id" column="id">
         <generator class="uuid.hex"></generator>
       </id>
       <property name="ClassName" column="classname"></property>
 
       <set name="students" lazy="true" inverse="false" cascade="save-update">
         <key column="class_id"></key>
         <one-to-many class="Cascade.saveUpdate.Student"/>
       </set>
      </class>
</hibernate-mapping>

       注意,cascade="saveupdate"和inverse="false"必须同时设置,才能让class维护级联关系,如果inverse="true"(不让class维护关系,哪cascad设置也不会有任何作用,虽然可以新插入一条学生的记录,但其class_id为null,无法实现引用关系).不过,使用cascade="save-update"删除集合中的数据时候,不能真正的从数据库中删除记录,只是简单的讲其关联约束字段(如team_id)设置为null,被删除的对象还是保留在session缓存中,还是可以通过removStu.setName("111")改变对象并进行持久化,如果需要使用这种方式删除对象并持久化,可以设置cascade="all-delete-orphan"

二、批量删除
       与批量更新原理相似,Hibernate中也是通过在集合中操作,才完成批量删除对象之间的关系或者删除父对象时删除子对象来达到批量删除的目的。
       在Hibernate中级联删除可以将cascade设置为delete或者all-delete-orphan.
       设置cascade="delete"的意思就是说,我在session.delete(class)的时候,可以一并删除与其关联的所有student。如
   
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Cascade.delete.Student" table="student">
  <id name="id" unsaved-value="null">
    <generator class="uuid.hex"></generator>
  </id>
  <property name="cardid" type="string"/>
  <property name="name" type="string"/>
  <property name="age" type="int"/>
  <many-to-one name="class"
               column="class_id"
               class="Cascade.delete.Class"
               lazy="no-proxy">
  </many-to-one>
</class>
 
</hibernate-mapping>
 

Class.hbm.xml
 
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Cascade.delete.Class" table="class" lazy="true">
       <id name="id" column="id">
         <generator class="uuid.hex"></generator>
       </id>
       <property name="className" column="classname"></property>
 
       <set name="students" lazy="true" inverse="false" cascade="delete">
         <key column="class_id"></key>
         <one-to-many class="Cascade.delete.Student"/>
       </set>
      </class>
</hibernate-mapping>


      设置cascade="all-delete-orphan',意思是删除父子关系时,自动删除不属于父对象的子对象,也支持级联删除和级联更新保存。

三、批量添加
      在实际程序开发中,经常需要持久化临时对象,比如新建一个学生,将加入到一个存在的班级中(或者新建的一个班级),需要在一方set标签中设置  cascade="save-update",如果这里把引起级联操作的对象称为根对象 ,而根对象可能出于transient,persistence,detach三态,我们只需要考虑这三种状态下对象的持久化过程就可以了。

四、总结
      持久性映射过程中最重要和最复杂的一环就是确定如何映射表间的关系。像其他产品一样, Hibernate 在该领域中提供了高度的灵活性,但却是以复杂度的增加为代价。而这样的代价却为我们在使用的过程中大大提供了便利,通常只需要一些简单的配置就可以完成一些复杂的操作。
  评论这张
 
阅读(40)| 评论(12)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017