2012-09-13 64 views
3

我在我的數據庫中有多對多(有連接表)的關係,我需要在休眠模型中進行建模。如何通過與hibernate的多對多關係來級聯保存?

我有數據庫中所有三個表的POJO類,因爲連接表不僅包含映射信息。

我的問題發生在類A的save()上,其中A類被告知要級聯到類AB(連接表),它被告知級聯到B類,但是當它到達它正在保存AB對錶A的foriegn鍵引用爲空。

在一天結束時,我希望能夠在TableA類的一個實例上調用save()並保存所有三個表。

Table Diagram

表A映射

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="com.example.dbtables.TableA" table="Table A"> 
     <id name="id" type="int"> 
      <column name="id" /> 
      <generator class="sequence"> 
       <param name="sequence">table_a_seq</param> 
      </generator> 
     </id> 
     <natural-id> 
     <property name="data1" type="int"> 
      <column name="DATA1" not-null="true" /> 
     </property> 
     <property name="data2" type="string"> 
      <column name="DATA2" length="16" not-null="true" /> 
     </property> 
     </natural-id> 
     <set name="tableAB" cascade="save-update" table="TableAB" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="Table_AB_ID" not-null="true" /> 
      </key> 
      <one-to-many class="com.example.dbtables.TableAB" /> 
     </set> 
    </class> 
</hibernate-mapping> 

TABLE AB映射

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="com.example.dbtables.TableAB" table="Table AB"> 
     <id name="id" type="int"> 
      <column name="id" /> 
      <generator class="sequence"> 
       <param name="sequence">table_ab_seq</param> 
      </generator> 
     </id> 
     <natural-id> 
     <many-to-one name="tableA" class="com.example.dbtables.TableA" fetch="select"> 
      <column name="Table_A_ID" not-null="true" /> 
     </many-to-one> 
     <many-to-one name="tableB" cascade="save-update" class="com.example.dbtables.TableB" fetch="select"> 
      <column name="Table_B_ID" not-null="true" /> 
     </many-to-one> 
     <property name="data1" type="int"> 
      <column name="DATA1" not-null="true" /> 
     </property> 
      <property name="data2" type="int"> 
      <column name="DATA2" not-null="true" /> 
     </property> 
     </natural-id> 
    </class> 
</hibernate-mapping> 

表B映射

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<!-- Generated Aug 27, 2012 2:16:37 PM by Hibernate Tools 3.4.0.CR1 --> 
<hibernate-mapping> 
    <class name="com.examples.dbtables.TableB" table="Table B"> 
     <id name="id" type="int"> 
      <column name="id" /> 
      <generator class="sequence"> 
       <param name="sequence">table_b_seq</param> 
      </generator> 
     </id> 
     <natural-id> 
     <property name="data1" type="string"> 
      <column name="DATA1" length="16" /> 
     </property> 
     <property name="data2" type="java.lang.Integer"> 
      <column name="DATA2" /> 
     </property> 
     </natural-id> 
     <set name="TableAB" table="Table AB" inverse="true" lazy="true" fetch="select"> 
      <key> 
       <column name="Table_AB_ID" not-null="true" /> 
      </key> 
      <one-to-many class="com.example.dbtables.TableAB" /> 
     </set> 
    </class> 
</hibernate-mapping> 

感謝您的幫助你可以給。讓我知道你是否需要澄清或更多信息。

編輯:我的問題是,從AB - >到A的參考沒有得到正確填充。感謝大家的幫助,這個問題已經解決了。

回答

0
A a = new A(); 
    B b = new B(); 
    AB ab = new AB(); 
    ab.setA(a); 
    ab.setB(b); 
    a.setAB(ab); 
    b.setAB(ab); 

    save(a); 

這個例子不工作?你有沒有得到一些例外?
編輯
看看這個休眠文檔Chapter 5. Basic O/R Mapping到章節5.1.4.1。發電機
PostgreSQL不支持身份生成類型。
使用序列一代,而不是身份,還是其他什麼東西

+0

我沒有收到異常,但收到一條錯誤消息,表AB上的保存不能發生,因爲它違反了非空約束。你提供的例子基本上是我正在做的,但是我使用JAXB來擴充我已經在我的類中使用的一些數據。 – randomwords

+0

我記得這個錯誤'它違反了非空約束'。這意味着AB中的A或B爲空,或者A中或B中的AB爲空。在保存之前調試您的對象 – Ilya

+0

是的,那是我所看到的錯誤。你是什​​麼意思「保存前調試你的對象」?我知道表A的ID在表AB中爲空,因爲級聯沿着鏈條走,並且表A尚未保存。 – randomwords

0

的問題是,AB之間的反向引用 - >一個並沒有獲得正確填充在我的代碼。感謝Ilya的幫助。

相關問題