还是Hibernate……
有两个实体类:A和B,双向多对多映射。属主类是A。
当向A的一个对象a添加——到B对象的若干实例的映射,并用Session.merge(a)持久化时,一切正常。
而向B的一个对象b添加——到A对象的若干实例的映射,并用Session.merge(b)持久化时,却没有任何反应。
两段代码几乎完全一样,效果却不同。于是想到了是不是Session.merge()带有数据完整性检查。于是在Session.merge(b)之后,又遍历了与b映射的所有A的实例并持久化。结果……可耻的失败了……映射关系仍然没得到保存。
静下心来仔细想了想,难道说在Session.merge(b)之后,Transaction.commit()之前,Hibernate就已经对数据库进行了完整性检查?因为属主类里的数据没变,所以Session.merge(b)的时候就把更新的映射关系当成废品抛弃了??
继续试验,把遍历操作放到Session.merge(b)之前。惊奇的发现,竟然保存上了。
无语啊……还好映射关系不多。要是多的话……遍历操作……岂不败了……诡异的Session.merge()……
有两个实体类:A和B,双向多对多映射。属主类是A。
当向A的一个对象a添加——到B对象的若干实例的映射,并用Session.merge(a)持久化时,一切正常。
而向B的一个对象b添加——到A对象的若干实例的映射,并用Session.merge(b)持久化时,却没有任何反应。
两段代码几乎完全一样,效果却不同。于是想到了是不是Session.merge()带有数据完整性检查。于是在Session.merge(b)之后,又遍历了与b映射的所有A的实例并持久化。结果……可耻的失败了……映射关系仍然没得到保存。
静下心来仔细想了想,难道说在Session.merge(b)之后,Transaction.commit()之前,Hibernate就已经对数据库进行了完整性检查?因为属主类里的数据没变,所以Session.merge(b)的时候就把更新的映射关系当成废品抛弃了??
继续试验,把遍历操作放到Session.merge(b)之前。惊奇的发现,竟然保存上了。
无语啊……还好映射关系不多。要是多的话……遍历操作……岂不败了……诡异的Session.merge()……