2016-11-04 11 views
2

私は休止状態のマッピングで宣言された親子関係を持っています。 Parentには、Childオブジェクトのコレクションが含まれています。私が作成し、新しい子オブジェクトを含む新しい親を保存すると、私はエラーを取得する:ここでHibernateの外部キーが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を取得するように通知しますが、これはうまくいきませんen。私はこのコードを実行するとエラーが表示されます。

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; 
    } 
} 

私は手動でaccesslistの上AccessListMembersコレクション内の各オブジェクトにLIST_IDを設定する必要がありますする必要はありません。私はJBossのドキュメントを読んだことがありますが、私は、一対多と多対1の関係がどのように機能するか誤解していると思います。

hibernateがAccessListでINSERTを実行し、AccessListMembersでLIST_IDを更新し、AccessListMembersでINSERTを実行するように、どのようにマッピングを設定できますか?

+0

ソリューションを見つけましたか? –

+0

@PeterRader Hibernateマッピングを使用して処理できる効率的なものではありません。ますます多くの場合、これは親子コレクションや休止状態の問題ですが、誰も私に固いソリューションを提供することはできませんでした。 – Encryption

答えて

1

親と子をダブルバインドする必要があります。 [OK]をクリックすると、親に子供を拘束 - しかし、あなたはこのように子供に親をバインドしませんでした:

accessListMember.setList(accessList); 

ところで、あなたはハイテク見直しが必要とのIoCを導入することができます。あなた自身でトランザクションを使用するのは古い、神秘的で危険な知識です。私はプログラマがトランザクションを使用しなければならないのは、トランザクショナルなセーブポイントを使用しなければならないことが分かっていました。

+0

私は各子をループしてaccessListMember.setAccessList(list)を実行しましたが、これは機能しませんでした。そのようなマッピングの目的を破ることはありませんか? 1000アイテムのコレクションがあればどうなりますか?私はそれぞれを個別に保存できるので、全体をループする必要はないと思います。 – Encryption

+0

@Encryptionあなたは 'cascade = all'を使っていますので、1000 accessListMemberのそれぞれを手動で保存しないでください。あなたが何を記述しても、この例外はスローされません。私はシーケンス 'ACCESS_LIST_MBRS_SEQ'でインターレースされているかもしれませんが、シーケンスでは' NULL'は無効ですか? –

関連する問題