hibernate+freemarker主外键关联表的非级联更新



hibernate+freemarker主外键关联表的非级联更新。hiabernate中的cascade =”all”级联更新从表的时候,会使程序的功能实现起来很容易。但如果想删掉主表的记录而从表的记录保留时,则应该cascade =”save-update”或者cascade =”none”(默认),当然这样还不够,应为在建立映射的时候,我们在从表里映射文件中有这么一句话:

这个时候应该把这句话注释掉,否则在浏览从表级联的时候会出现找不到主表的错误:org.hibernate.ObjectNotFoundException: No row with the given identifier

(但是,在这里,如果注释掉以后,在你增加从表数据的时候,就不能给外键赋值,默认为null插入数据库,这不是我们想要的。如何解决这个问题,又能在查询的时候不出错,有待继续研究。)

而在ftl页面,应该用exists判断是否有主表数据,如:

<#if (busTrainMan.busInfo)?exists>${busTrainMan.busInfo.cph}<#else>-

如果不判断,哈哈,ftl的黄色页面(这个对象没定义)就来了~~~


当然除了这些设置以外,如果数据中建立的关系时,如果在“对复制强制关系”和对”insert和update强制关系”打勾的话,这时候如果删除主键表数据是,从表如果有数据,还是会报错的,应该把以上2个选项去掉即可。

后续:

关于保持住从表关系,保留后,如果删除主表数据,在select 从表得时候,从表中有数据而找不到主表中关联是数据的时候,就会出现上面提到的错误:org.hibernate.ObjectNotFoundException: No row with the given identifier

要解决这个错误,除非删除无效数据(脱离的主表的数据),或者把从表管理主表的外键设为nul

l,在页面可以判断是否为null来出来,就像上面说的ftl页面处理一样。但是程序如何在删除主表数据的同时自动设从表外键为null,还没有找到可以配置的方法。把cascade =”save-update”也不行。

最后用了一个笨方法,就是手动使用程序当删除主表数据的时候设置从表外键为null,问题解决。

可参考:http://www.springframework.cn/read.php?tid=285