2016-11-04 1 views
2

Ich habe eine Parent/Child Beziehung in meinen Hibernate Mappings deklariert. Das Parent enthält eine Sammlung von Child-Objekten. Wenn ich schaffen und eine neue übergeordnete speichern, die neue untergeordnete Objekte enthält, erhalte ich eine Fehlermeldung:Hibernate Foreign Key aktualisiert nicht auf SaveOrUpdate

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

Hier ist die Mutter Mapping ist:

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

Das Kind Mappings:

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

Ich dachte, das Hinzufügen der Join Informationen in der Kind-Mapping würde Hibernate wissen, um die LIST_ID aus dem übergeordneten Objekt ACCESS_LIST.ID erhalten, aber das ist nicht glücklich de. Ich erhalte den Fehler bei der Ausführung dieses Codes:

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

Ich will nicht von Hand haben, um die LIST_ID auf jedem der Objekte in der AccessListMembers Sammlung auf Access gesetzt. Ich habe die JBOSS-Dokumentation gelesen, aber ich glaube, ich habe missverstanden, wie die One-to-Many- und die Many-to-One-Beziehungen funktionieren.

Wie kann ich meine Mappings einrichten, so dass Hibernate ein INSERT auf AccessList ausführen kann, die LIST_ID auf AccessListMembers aktualisieren und eine INSERT auf AccessListMembers durchführen?

+0

Haben Sie eine Lösung gefunden? –

+0

@PeterRader Keine effiziente Lösung, die mit den Hibernate-Zuordnungen verarbeitet werden kann. Ich stelle immer öfter fest, dass dies ein Problem mit Eltern/Kind-Sammlungen und Winterschlaf ist, aber niemand konnte mir eine solide Lösung anbieten. – Encryption

Antwort

1

Sie müssen das Eltern- und das Kind-Objekt doppelt binden. Sie verpflichtet, das Kind zum Vater, ok - aber du hast nicht die Eltern auf das Kind wie folgt gebunden:

accessListMember.setList(accessList); 

By the way, Sie ein Tech-Review benötigen und IoC einführen. Es ist ein altes, mystisches und gefährliches Wissen, Transaktionen selbst zu benutzen. Ich habe gesehen, dass Programmierer Transaktionen verwenden müssen, weil sie Transaktions-Savepoints verwenden mussten, wenn es in Ihrem Fall ist, haben Sie Spaß.

+0

Ich habe über jedes Kind geloopt und eine AccessListMember.setAccessList (Liste) gemacht, aber das hat nicht funktioniert. Verletzt das nicht den Zweck von Mappings? Was wäre, wenn ich eine Kollektion mit 1000 Artikeln hätte? Ich denke nicht, dass ich die ganze Sache durchspielen sollte, weil ich jeden einzeln speichern könnte. – Encryption

+0

@Encryption Sie verwenden 'cascade = all', also sollten Sie nicht jedes der 1000 accessListMember manuell speichern. Was Sie beschreiben, darf diese Ausnahme nicht auslösen. Ich könnte an der Sequenz 'ACCESS_LIST_MBRS_SEQ' interessiert sein. Sind Sie sicher, dass 'NULL' in der Sequenz ungültig ist? –