hibernate映射文件中cascade="delete"不好使,怎么办

来源:百度知道 编辑:UC知道 时间:2024/06/03 00:56:13
UserStatus.hbm.xml:
<set cascade="all" name="users" inverse="true" lazy="true">
<key>
<column name="statId"/>
</key>
<one-to-many class="order.vo.UserVO"/>
</set>

UserVO.hbm.xml:
<many-to-one name="status" class="order.vo.UserStatus">
<column name="statId"/>
</many-to-one>

执行session.delete(status);
控制台显示:
Hibernate: select web...
Hibernate: delete from UserStatus where id=?
Hibernate: select web...

去掉cascade="delete",控制台上依旧显示
Hibernate: select web...
Hibernate: delete from UserStatus where id=?
Hibernate: select web...

就是说cascade=all,svae-update,delete任何属性,hibernate2都没反应.从前我也遇到过一次这种情况,莫明其妙自己好使了,弄得我自己现在还胡里胡涂的:

楼上说的很对
楼主你用session.delete(某个user就知道了);
_____________________________________________
哦不好意思,看错了楼主表了,userStatucs是parent,那就应该做主控方,inverse也不用改的true是对的,
你的问题很奇怪啊,应该删的掉的,楼主有没有试验过呢,你把主表删了,子表里数据还在吗,有时候删除是批量删除的(一开始存在缓冲里,到达一定量才一起删除的,楼主你不要看控制台,以数据库为准)如果还不行lazy改为false试试,

cascade="all"

Transaction tx = session.beginTransaction();
...
tx.commit();

还有顺便问一下:
你的UserVO.hbm.xml <key>
<column name="statId"/>
</key> 将vstatId设为主键了么?

inverse="true",表示关系由对方表维护,也就是UserVO来维护的。你delete或者updateUserVO的时候,会级联到UserStatus。删除自己,当然不会删除UserVO,除非你把inverse="false",由自己维护。
第二个问题,如果删除了肯定就找不到记录了,也就出现了丢失数据的情况。一般情况下,我会有一个状态字段,表示记录是否被删除过了,如果删除了,就将这个字段设置成为“已删除”。这样不会出现丢失数据的情况。特别是做报表的时候,尤其重要。

另外一个问题也一起问了吧:
如果子表中的某记录的父记录已经被删除,如果找到子表中这些已经废弃的记录?

这个问题...如果级联的话...

父记录删除了..子记录也不复存在了..