如何处理hibernate多重级联关系下的删除问题 新手 还没遇到过 在dao层 用sql控制吧 哈哈 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 one to many的映射设置cascade=CascadeType.ALL 在xxx.hbm.xml中相对的<set cascade="all"></set> 在set里面添加属性cascade="all"表示级联操作。all代表所有,如增、删、改! 你的 person //人员表是主键,那么你就在person //人员表的xxx.hbm.xml的<set name="实体名(person)" inverse="true" cascade="delete">cascade="delete">就是级联删除 set节点之cascade属性all : 对所有操作都进行级联none : 对所有操作都不进行级联save-update : 执行更新操作时级联delete : 执行删除操作时级联inverse设为true,由many一方删除inverse是“反转”的意思,表示关联关系的控制权。为true,表示由对方负责关联关系的添加和删除;为false,表示由自己负责维护关联关系最终解决方法是person中的xxx.hbm.xml加上<set name="实体名(person)" inverse="true" cascade="delete"></set>然后在email中的也加上<set name="实体名(email)" inverse="true" cascade="delete"></set>简单的说就是在主表的xxx.hbm.xml的<set></set>的属性中加上cascade="delete"它,就可以级联删除删除时候根据person的id来删除,即先查Person的id,在执行删除如果这都不是你要的结果,那我也就没办法了 person是email的主表,而email又是letter的主表这样配置是不会违反你的题目意思的也就是说在Person中加cascade="delete"只会删除email而email中加这个属性也是一样 并且你的三张表都有关系,所以执行就感觉是三张表的数据一起删除 这种解决方案在级联删除时,首先hibernate要在缓存中加载person,同时要抓取email、letter(怎么做到?我只能在person中抓取email,但不能抓取letter),这样才可以删除。但性能受到影响。我最后的方法舍弃了hibernate的级联删除,使用程序控制:DAO层:letterDao,按emailid删除letteremailDao,按personid删除emailpersonDao,按id删除personService层按id删除一个person的具体操作(调用DAO层):(1)查出所拥有的所有eamilid(2)对每个eamilid调用letterDao删除letter(3)调用personDao删除email这样做的好处:利用了spring的事务管理,三个步骤有一个出错,则自动回滚,保证数据正确性。性能有了很多提高。 关于JAVA for循环效率的问题 类在子目录中引用出错,是否路径的问题 求助!还是中文乱码的问题 OpenSessionInView 将CS的dll封装成BS的OCX,需要哪些步骤(及内部简单原理)? 用spring rmi封装的事务管理的一个棘手问题 使用spring,如何封装以下代码? 一个hibernate一对多问题!来抢分,马上结帖 osb中javabean如何调用jms协议的proxy JDBC关于同时取得存储过程的返回值和结果集的问题,解决马上结帖! struts和spring整合 关于j2ee的scope问题
表示级联操作。all代表所有,如增、删、改!
你的 person //人员表是主键,那么你就在person //人员表的xxx.hbm.xml的<set name="实体名(person)" inverse="true" cascade="delete">
cascade="delete">就是级联删除
all : 对所有操作都进行级联
none : 对所有操作都不进行级联
save-update : 执行更新操作时级联
delete : 执行删除操作时级联
inverse设为true,由many一方删除
inverse是“反转”的意思,表示关联关系的控制权。
为true,表示由对方负责关联关系的添加和删除;
为false,表示由自己负责维护关联关系最终解决方法是person中的xxx.hbm.xml加上<set name="实体名(person)" inverse="true" cascade="delete"></set>
然后在email中的也加上<set name="实体名(email)" inverse="true" cascade="delete"></set>简单的说就是在主表的xxx.hbm.xml的<set></set>的属性中加上cascade="delete"它,就可以级联删除删除时候根据person的id来删除,即先查Person的id,在执行删除
如果这都不是你要的结果,那我也就没办法了
这样配置是不会违反你的题目意思的
也就是说在Person中加cascade="delete"只会删除email
而email中加这个属性也是一样 并且你的三张表都有关系,所以执行就感觉是三张表的数据一起删除
DAO层:
letterDao,按emailid删除letter
emailDao,按personid删除email
personDao,按id删除personService层按id删除一个person的具体操作(调用DAO层):
(1)查出所拥有的所有eamilid
(2)对每个eamilid调用letterDao删除letter
(3)调用personDao删除email
这样做的好处:
利用了spring的事务管理,三个步骤有一个出错,则自动回滚,保证数据正确性。
性能有了很多提高。