论坛首页 Java企业应用论坛

父子关系的修改与删除详解

浏览 21605 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-01-15  
*下面要谈的delete的时候父子关系(这里谈论cacade设置中包含delete的情况)

*cacade 设置的情况下,以下说明成立

remove例一:


                ITxMgr tx = null;
                tx = HibernateTxMgr.beginTrans("Delete a relationships...");
                session = (Session) tx.getSession();
                parent.getChildren().remove(0);
                session.flush();
                tx.endTrans();

remove例二: *无论是否设置inverse="true"都不会将孩子从父亲中删除!parent.getChildren().remove(0); 这么写毫无作用!                 ITxMgr tx = null;
                tx = HibernateTxMgr.beginTrans("Delete a relationships...");
                session = (Session) tx.getSession();
                List ChildList = parent.getChildren();
                ChildPO child= (ChildPO)ChildList.get(0);
                child.setParent(null);
                session.update (parent);
                session.flush();
                tx.endTrans();

*无论是否设置inverse="true"都会将孩子从父亲中删除!所以注意要改变父子关系最好还是由孩子一方来改变,儿子删除了不会影响父亲!
remove例三:

                ITxMgr tx = null;
                tx = HibernateTxMgr.beginTrans("Delete a relationships...");
                session = (Session) tx.getSession();
                session.delete (parent);
                session.flush();
                tx.endTrans();

*父亲删除了所有的儿子也被删除
*下面再来谈一下修改

                ITxMgr tx = null;
                tx = HibernateTxMgr.beginTrans("Delete a relationships...");
                session = (Session) tx.getSession();
                List ChildList = parent.getChildren();
                ChildPO child= (ChildPO)ChildList.get(0);
                child.setName("null");
                session.update (parent);
                session.flush();
                tx.endTrans();

*虽然只保存了父亲但是儿子的变化也被保存了 而且只生成了一条sql Hibernate: update CHILD set PARENTID=?, NAME=? where ID=?
   发表时间:2004-01-17  
这个帖子不错,希望楼主继续补充。

谈谈我对update的用法:
通过级连来实现对子类对象的添加和更新的方法如楼主所说:
//添加
parent.add(child);
sess.upate(parent);
...
//更新
child.setXXX(xxx);
sess.upate(parent);
这样是可行的,但是如果配置文件写的不太好的话,有可能导致多余的sql产生。
为了防微杜渐,我习惯还是增加什么改变什么,我就直接对它操作。
如下:
//添加:
child.setParent(parent);
sess.save(child);
...
//更新
child.setXXX(xxx);//当然是个持久对象
sess.commit();
0 请登录后投票
   发表时间:2004-05-13  
谢谢大家的帮助和自己不懈的努力,我建立好了父子关系,代码都基本正常,使用dbunit做单元测试,有两个问题是关于删除的:

1、在父这一端级联添加、更新、删除都搞定了,但删除所有父表中数据的时候,如果不马上关闭session,如果再做下一个删除test的时候就会出错。hibernate说发现了子,但不去删除。但是做其他操作都没有问题,或者删除之前做其他操作都没有问题。如果removeAll()后马上Session.close就没有问题(我不希望总是要在方法中关闭session。)

2、在子这一端,如果想删除子,而不影响父就不行,hibernate说这样做太危险了,我不干!!(Flush during cascade is dangerous - this might occur if an object was deleted and then re-saved by ),但是如果按照父来删除子就没有问题,但仅仅限于从父中连带子一起删除。

说明一下,删除表中所有数据是用的HSQL,而按父删除用的是parent.delete(po,po.getId())。

总结一下,是不是这样的理解:当建立父子关系时,我希望可以从父一并删除、更新、添加子,而希望在删除、更新子时,不对父有影响的时候,该如何做的问题。

相信这种情况大家也遇到过,请大家指点。
0 请登录后投票
   发表时间:2004-07-13  
collins 写道
谢谢大家的帮助和自己不懈的努力,我建立好了父子关系,代码都基本正常,使用dbunit做单元测试,有两个问题是关于删除的:

1、在父这一端级联添加、更新、删除都搞定了,但删除所有父表中数据的时候,如果不马上关闭session,如果再做下一个删除test的时候就会出错。hibernate说发现了子,但不去删除。但是做其他操作都没有问题,或者删除之前做其他操作都没有问题。如果removeAll()后马上Session.close就没有问题(我不希望总是要在方法中关闭session。)

2、在子这一端,如果想删除子,而不影响父就不行,hibernate说这样做太危险了,我不干!!(Flush during cascade is dangerous - this might occur if an object was deleted and then re-saved by ),但是如果按照父来删除子就没有问题,但仅仅限于从父中连带子一起删除。

说明一下,删除表中所有数据是用的HSQL,而按父删除用的是parent.delete(po,po.getId())。

总结一下,是不是这样的理解:当建立父子关系时,我希望可以从父一并删除、更新、添加子,而希望在删除、更新子时,不对父有影响的时候,该如何做的问题。

相信这种情况大家也遇到过,请大家指点。


在one to many 的配置那里设置cascade="all-delete-orphan"
hibernate源码中可以看到它判断type是否为deleteOrphan,如果是,则对colletion(儿子们)中被remove了的各节点调用delete语句
0 请登录后投票
   发表时间:2004-09-22  
如果我想更新父对象的主键,而其子对象的外键也随之发生相应变化,如何实现?
0 请登录后投票
   发表时间:2004-12-23  
frankensteinlin 写道
ITxMgr tx = null;
tx = HibernateTxMgr.beginTrans("Delete a relationships...");
session = (Session) tx.getSession();
List ChildList = parent.getChildren();
ChildPO child= (ChildPO)ChildList.get(0);
child.setParent(null);
session.update (parent);
session.flush();
tx.endTrans();

*无论是否设置inverse="true"都会将孩子从父亲中删除!所以注意要改变父子关系最好还是由孩子一方来改变,儿子删除了不会影响父亲!


这个例子有问题,它只是删除了子对象与父对象的关系而已,没有真正删除数据库中的信息!
0 请登录后投票
   发表时间:2004-12-24  
同意楼上的说法这个例子是错的
0 请登录后投票
   发表时间:2004-12-27  
这要你怎样看待父子关系了 具体说就是是否存在没有父亲的儿子,不知道父亲是谁的儿子也存在的阿,所以当关系由儿子维护时他不会把自己删除的。只是脱离了父子关系而一。如果你的父子关系模型要求儿子是一定要有父亲的,不与允许不知道父亲的儿子存在。那么首先parent_id not null,并且关系要父亲来维护。因为这个时候儿子的生命周期完全由父亲掌握了。

首先要看 你的父子关系具体是怎样的关系!
0 请登录后投票
   发表时间:2004-12-27  
marklxx500 写道
frankensteinlin 写道
ITxMgr tx = null;
tx = HibernateTxMgr.beginTrans("Delete a relationships...");
session = (Session) tx.getSession();
List ChildList = parent.getChildren();
ChildPO child= (ChildPO)ChildList.get(0);
child.setParent(null);
session.update (parent);
session.flush();
tx.endTrans();

*无论是否设置inverse="true"都会将孩子从父亲中删除!所以注意要改变父子关系最好还是由孩子一方来改变,儿子删除了不会影响父亲!


这个例子有问题,它只是删除了子对象与父对象的关系而已,没有真正删除数据库中的信息!


要看你父子关系是怎么设置的!!!!!
0 请登录后投票
   发表时间:2004-12-28  
正如我上文所说的:父子关系并不是固定的,请你把握设定的父子关系有的一意见错误指出说出来:楼上的那一句话:只是发泄个人的感情,对讨论问题无意义
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics