如何正确设置Hibernate级联

时间:2011-10-28 21:06:19

标签: hibernate foreign-keys hibernate-cascade

我有以下设置

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

  1. 它会插入B
  2. 它会插入B18n
  3. 使用saveOrUpdate

    1. 插入B18n,这显然会导致异常
    2. 是这个定义的(预期的)行为,还是我的设置有问题。

1 个答案:

答案 0 :(得分:1)

经过一番摆弄后,发现解决方案是什么。

我正在向现有B添加新元素。但是没有设置B的id,因为merge在发出保存/更新之前执行了对象图的SELECT,这没有问题。

另一方面,

saveOrUpdate不会这样做。因此例外。

结案;)