锁定老帖子 主题:父子关系的修改与删除详解
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-01-15
*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=? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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(); |
|
返回顶楼 | |
发表时间: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())。 总结一下,是不是这样的理解:当建立父子关系时,我希望可以从父一并删除、更新、添加子,而希望在删除、更新子时,不对父有影响的时候,该如何做的问题。 相信这种情况大家也遇到过,请大家指点。 |
|
返回顶楼 | |
发表时间: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语句 |
|
返回顶楼 | |
发表时间:2004-09-22
如果我想更新父对象的主键,而其子对象的外键也随之发生相应变化,如何实现?
|
|
返回顶楼 | |
发表时间: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"都会将孩子从父亲中删除!所以注意要改变父子关系最好还是由孩子一方来改变,儿子删除了不会影响父亲! 这个例子有问题,它只是删除了子对象与父对象的关系而已,没有真正删除数据库中的信息! |
|
返回顶楼 | |
发表时间:2004-12-24
同意楼上的说法这个例子是错的
|
|
返回顶楼 | |
发表时间:2004-12-27
这要你怎样看待父子关系了 具体说就是是否存在没有父亲的儿子,不知道父亲是谁的儿子也存在的阿,所以当关系由儿子维护时他不会把自己删除的。只是脱离了父子关系而一。如果你的父子关系模型要求儿子是一定要有父亲的,不与允许不知道父亲的儿子存在。那么首先parent_id not null,并且关系要父亲来维护。因为这个时候儿子的生命周期完全由父亲掌握了。
首先要看 你的父子关系具体是怎样的关系! |
|
返回顶楼 | |
发表时间: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"都会将孩子从父亲中删除!所以注意要改变父子关系最好还是由孩子一方来改变,儿子删除了不会影响父亲! 这个例子有问题,它只是删除了子对象与父对象的关系而已,没有真正删除数据库中的信息! 要看你父子关系是怎么设置的!!!!! |
|
返回顶楼 | |
发表时间:2004-12-28
正如我上文所说的:父子关系并不是固定的,请你把握设定的父子关系有的一意见错误指出说出来:楼上的那一句话:只是发泄个人的感情,对讨论问题无意义
|
|
返回顶楼 | |