我有以下设置
A - > B - > ç
A-映射:
<hibernate-mapping>
<class name="db.base.A" table="A">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<set name="Bs" table="BI18n" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan">
<key>
<column name="A_id" not-null="true" />
</key>
<one-to-many class="db.base.B" />
</set>
</class>
</hibernate-mapping>
B:
<hibernate-mapping>
<class name="db.base.B" table="B">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<many-to-one name="A" class="db.base.A" fetch="select">
<column name="A_id" not-null="true" />
</many-to-one>
<set name="B" table="B" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan">
<key>
<column name="id" not-null="true" />
</key>
<one-to-many class="db.base.BI18n" />
</set>
</class>
</hibernate-mapping>
SubstanceItentifiedI18n:
<hibernate-mapping>
<class name="db.base.BI18n" table="B18n">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<many-to-one name="B" class="db.base.B" fetch="select">
<column name="id" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
当我通过
插入带有完整对象图的新A时HibernateDaoSupport.merge(AObj);
一切都是正确创造的。
但如果我使用
HibernateDaoSupport.saveOrUpdate(AObj);
我得到DataIntegrityException
Cannot add or update a child row: a foreign key constraint fails
(`table`.`B18n`, CONSTRAINT `B18n_fk`
FOREIGN KEY (`id`) REFERENCES `B` (`id`))
当我查看log4j日志时,我会看到merge
B
B18n
使用saveOrUpdate
B18n
,这显然会导致异常是这个定义的(预期的)行为,还是我的设置有问题。
答案 0 :(得分:1)
经过一番摆弄后,发现解决方案是什么。
我正在向现有B
添加新元素。但是没有设置B
的id,因为merge在发出保存/更新之前执行了对象图的SELECT
,这没有问题。
saveOrUpdate
不会这样做。因此例外。
结案;)