hibernate+freemarker主外键关联表的非级联更新。hiabernate中的cascade =”all”级联更新从表的时候,会使程序的功能实现起来很容易。但如果想删掉主表的记录而从表的记录保留时,则应该cascade =”save-update”或者cascade =”none”(默认),当然这样还不够,应为在建立映射的时候,我们在从表里映射文件中有这么一句话:
这个时候应该把这句话注释掉,否则在浏览从表级联的时候会出现找不到主表的错误:org.hibernate.ObjectNotFoundException: No row with the given identifier
(但是,在这里,如果
而在ftl页面,应该用exists判断是否有主表数据,如:
<#if (busTrainMan.busInfo)?exists>${busTrainMan.busInfo.cph}<#else>-#if>
如果不判断,哈哈,ftl的黄色页面(这个对象没定义)就来了~~~
当然除了这些设置以外,如果数据中建立的关系时,如果在“对复制强制关系”和对”insert和update强制关系”打勾的话,这时候如果删除主键表数据是,从表如果有数据,还是会报错的,应该把以上2个选项去掉即可。
后续:
关于保持住从表关系,保留
要解决这个错误,除非删除无效数据(脱离的主表的数据),或者把从表管理主表的外键设为nul
l,在页面可以判断是否为null来出来,就像上面说的ftl页面处理一样。但是程序如何在删除主表数据的同时自动设从表外键为null,还没有找到可以配置的方法。把cascade =”save-update”也不行。
最后用了一个笨方法,就是手动使用程序当删除主表数据的时候设置从表外键为null,问题解决。
可参考:http://www.springframework.cn/read.php?tid=285