一.子表的外键是空值
可能原因:父表的hbm.xml文件中对set标签的设置为inverse="true",
如图:
而在添加时又是以父表的集合添加子表元素的,导致数据库中子表的外键为空
如图:
解决办法:1.可以将inverse置为"false",不写默认为false.
inverse简介:
inverse的意思是反转,用来设置关系哪一方是拥有者owner,由他来维护这个关系。
在一对多的关系中,包含Set/Collection 类实例是“一”,Set里面包含的类实例则是“多”的一方。可以理解为 Set/Collectin 是代码中一对多关系的表达,包含Set/Collection的类实例在没有设置inverse的时候是owner。
inverse="false" 是默认情况,此时没有反转,则 Set/Collection 关系由包含它的“一”这一方来维;
inverse="true" 时,表示 Set/Collection 关系由另一方来维护,由不包含这个关系的一方来维护这个关系,所以才称为“反转”了。
二.测试时出现TransientObjectException异常
这个异常代表一个持久化对象关联了一个瞬时对象。出现问题,就要着手解决,那又怎么解决呢?我们可以使用级联操作来解决上述的问题.
可能的解决办法:在一对多映射中设置cascade="save-update".
如图:
cascade简介:
所谓cascade,就是说我在更新一方的时候,可以根据这一方对象之间的关联关系,去对被关联方进行持久化,
比如说Team和Student之间的1对多关系,使用cascade,可以在team方维护其持有的student集合时,
自动对其新增,修改,删除的student对象进行持久化,而没必要显式的进行session.save(student)操作
参考文档:
1).https://blog.csdn.net/yerenyuan_pku/article/details/70152173
2).https://blog.csdn.net/daryl715/article/details/1916060
3).https://blog.csdn.net/yyd19921214/article/details/41113797