2016-11-04 90 views
2

我在我的休眠映射中聲明瞭父/子關係。父項包含一個Child對象的集合。當我創建並保存包含新的子對象的新父母,我得到一個錯誤:休眠外鍵在SaveOrUpdate上不更新

Cannot insert NULL into ("SCHEMA"."ACCESS_LIST_MEMBERS"."LIST_ID")

這裏是父映射:

<hibernate-mapping> 
<class name="AccessLists" optimistic-lock="version" schema="schema" table="ACCESS_LISTS"> 
<id name="id" type="java.lang.Integer"> 
    <column name="ID" precision="38" scale="0"/> 
    <generator class="sequence"> 
     <param name="sequence">ACCESS_LISTS_SEQ</param> 
    </generator> 
</id> 
<property name="userId" type="java.lang.Integer"> 
    <column name="USER_ID" not-null="true" precision="38" scale="0"/> 
</property> 
<property name="name" type="string"> 
    <column length="30" name="NAME" not-null="true"/> 
</property> 
<set name="accessListMembers" cascade="all" table="ACCESS_LIST_MEMBERS" inverse="false" fetch="select"> 
    <key> 
     <column name="LIST_ID" precision="38" scale="0" not-null="true" /> 
    </key> 
    <one-to-many class="AccessListMembers" /> 
</set> 
</class> 
</hibernate-mapping> 

的子映射:

<hibernate-mapping> 
<class name="AccessListMembers" optimistic-lock="version" schema="schema" table="ACCESS_LIST_MEMBERS">  
<id name="id" type="java.lang.Integer"> 
    <column name="ID" /> 
    <generator class="sequence"> 
     <param name="sequence">ACCESS_LIST_MBRS_SEQ</param> 
    </generator> 
</id> 
<property name="listId" type="java.lang.Integer"> 
    <column name="LIST_ID" not-null="true" /> 
</property> 
<property name="wwid" type="string"> 
    <column length="5" name="WWID" not-null="true"/> 
</property> 
<join table="AccessLists" inverse="true"> 
     <key column="ID"/> 
     <many-to-one name="accessList" column="LIST_ID" not-null="true"/> 
</join> 
</class> 
</hibernate-mapping> 

我認爲在子映射中加入加入信息會讓hibernate知道從父對象ACCESS_LIST.ID獲得LIST_ID,但這並不好恩。我在執行此代碼得到的錯誤:

public static void saveList(AccessLists list) { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    Transaction tx = session.beginTransaction(); 
    try { 
     session.saveOrUpdate(list); 
     tx.commit(); 
    } catch (Exception e) { 
     tx.rollback(); 
     throw e; 
    } 
} 

我不希望有手動設置LIST_ID每個在accesslist中的AccessListMembers集合中的對象。我已經瀏覽了JBOSS文檔,但我想我誤解了一對多和多對一的關係是如何工作的。

如何設置我的映射,以便hibernate知道要在AccessList上執行INSERT,更新AccessListMembers上的LIST_ID,並在AccessListMembers上執行INSERT?

+0

您是否找到解決方案? –

+0

@PeterRader不是一個可以通過使用Hibernate映射進行處理的有效方法。越來越多的時候,我發現這是父/子集合和休眠問題,但沒有人能夠爲我提供一個可靠的解決方案。 – Encryption

回答

1

您必須雙重綁定父級和子級。您綁定的孩子家長,確定 - 但你沒有綁定的父母給孩子這樣的:

accessListMember.setList(accessList); 

順便說一句,你可能需要一個技術審查,並引進國際奧委會。自己使用交易是一種古老的,神祕的和危險的知識。我看到程序員必須使用事務,因爲他們必須使用事務保存點,如果是你的情況,玩得開心。

+0

我打開了每個孩子,並做了accessListMember.setAccessList(列表),但沒有奏效。這不是打破映射的目的?如果我有一個1000件物品收藏會怎麼樣?我不認爲我應該循環整個事情,因爲我可以單獨保存每一個。 – Encryption

+0

@加密您正在使用'cascade = all',因此您不能通過手動保存1000個accessListMember中的每一個。你所描述的不應該拋出這個例外。我可能會對'ACCESS_LIST_MBRS_SEQ'序列感興趣,你確定'NULL'在序列中是無效的嗎? –