网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

Hibernate 级联关系说明 - 关于cascade和inverse的用法

http://www.diybl.com/ 2008-3-26  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

 

hibernate中一对多关联时会经常用到inverse和cascade属性 ,

inverse 有两个值 true ,false  ;如果设置为true 则表示当前对象不负责讲级联对象的状态变化同步到数据库 ;设置false则相反,其默认值为false;


cascade 有五个选项 分别是: all ,delete ,none,save-update,delete-orphan ;
        all : 所有情况下均进行关联操作。
        none:所有情况下均不进行关联操作。这是默认值
        save-update:在执行save/update/saveOrUpdate时进行关联操作。
        delete:在执行delete时进行关联操作。
        delete-orphan: 当save/update/saveOrUpdate时,相当于save-update ;当删除操作时,相当于delete ;


all的意思是save-update + delete
all-delete-orphan 的意思是当对象图中产生孤儿节点时,在数据库中删除该节点
all比较好理解,举个例子说一下all-delete-orphan:
Category与Item是一对多的关系,也就是说Category类中有个Set类型的变量items.
举个例子,现items中存两个Item, item1,item2,如果定义关系为all-delete-orphan
当items中删除掉一个item(比如用remove()方法删除item1),那么被删除的Item类实例
将变成孤儿节点,当执行category.update(),或session.flush()时
hibernate同步缓存和数据库,会把数据库中item1对应的记录删掉


测试Hibernate中的三个属性:lazy,inverse,cascade

【测试环境】
一对多关系的两张表:boy、girl(一个男孩可以多个女朋友)

 boy表结构
 Field   Type        
 ------  ----------- 
 name    varchar(50)  pk
 age     varchar(50) 

 girl表结构
 Field   Type        
 ------  ----------- 
 name    varchar(50)  pk
 bf      varchar(50)  fk 

【保存时:Inverse与cascade

 创建三个girl对象和一个boy对象,让这是三个girl都是boy的女朋友

  ---------创建对象的代码片段-----------
  Boy boy = new Boy("tom","23", null);

  Set girls = new HashSet();
  
  Girl g[] = new Girl[]{
                        new Girl("Alice1", boy),
                        new Girl("Alice2", boy),
                        new Girl("Alice3", boy)};
  girls.add(g[0]);
  girls.add(g[1]);
  girls.add(g[2]);
  
  boy.setGirls(girls);
 
 在Boy.hbm.xml中设置,然后对boy对象进行保存。

 1.Inverse = true,不指定cascade
   cascade的默认值为none, 当对boy进行保存操作时,girl什么都不做. 所以只保存了boy对象, 没有保存girl对象

 2.Inverse = true,cascade=all
   boy与girl对象,包扩外键都成功保存。
   (生成3条SELECT语句和4条INSERT语句,一下简称SELECT 3, INSERT 4)

 3.Inverse = false,不指定cascade
   报错。因为boy为主控方,负责维护关系,所以在插入boy对象后,会尝试修改并不存在的girl对象。

 4.Inverse = false,cascade=all
   boy与girl对象,包扩外键都成功保存。
   (SELECT 4, INSERT 4, UPDATE 3)

   分析:除了4条INSERT语句之外,其他的6条语句是我们为了图方便付出的代价:3条SELECT语句用来判断girl对象是否在数据表中已经存在,3条UPDATE语句是为了维护外键关系

 高效率的做法:在Boy.hbm.xml中设置Inverse=true,在Girl.hbm.xml中设置Inverse=false, cascade=all,然后保存三个girl对象
 (SELECT 1, INSERT 4)

   高效率的代价就是保存的时候比较麻烦

【删除时:Inverse与cascade

 希望通过删除boy,也将3个girl对象删除。程序中先查出boy对象,然后进行删除
  -----------------------------------------
  Boy boy = (Boy) s.get(Boy.class, "tom");
  s.delete(boy);
  ----------

欢迎光临DIY部落,点击这里查看更多文章教程   【点击打包该文章】
如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言