NHibernate einer Eins-zu-Eins-Abbildung in dem zweiten Tabellendaten null sein kann

StackOverflow https://stackoverflow.com/questions/244812

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe eine vorhandene Datenbank mit den Tabellen Transaktionen in ihm. Ich habe eine neue Tabelle mit dem Namen TransactionSequence hinzugefügt, in dem jede Transaktion letztendlich hat nur einen Datensatz. Wir werden mit der Sequenztabelle Transaktionen für ein bestimmtes Konto zu zählen. Ich habe dies als eine Abbildung eins-zu-eins zugeordnet, wo TransactionSequence einen Primärschlüssel der TransactionId hat.

Die Einschränkung ist, dass es einen anstelle von Trigger auf der Transaktionstabelle ist erlaubt keine Updates von Transaktionen storniert oder gebucht.

Also, wenn die Sequenz berechnet wird und die Transaktion wird gespeichert, versucht NHibernate ein Update auf die Transaktion wie ‚UPDATE Transaktion SET TransactionId = schicken? WHERE TransactionId =?‘. Aber das schlägt fehl, da der Auslöser. Wie kann ich mein konfigurieren Mapping, so dass NHibernate wird nicht versuchen, die Transaktion Tabelle zu aktualisieren, wenn eine neue TransactionSequence Tabelle eingefügt wird?

Transaktionszuordnung:

<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
    <id name="Id" column="ID">
        <generator class="native" />
    </id>

    <property name="TransactionTypeId" access="field.camelcase-underscore" />
    <property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />

    <one-to-one name="Sequence" class="TransactionSequence" fetch="join"
                 lazy="false" constrained="false">      
    </one-to-one>
</class>

Und das Sequenz-Mapping:

<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
    <id name="TransactionId" column="TransactionID" type="Int32">
        <generator class="foreign">
            <param name="property">Transaction</param>
        </generator>
    </id>

    <version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />

    <property name="SequenceNumber" not-null="true" />

    <one-to-one name="Transaction" 
                class="Transaction" 
                constrained="true" 
                foreign-key="fk_Transaction_Sequence" />

</class>

Jede Hilfe wäre sehr geschätzt ...

War es hilfreich?

Lösung

Ein zu-Eins-Abbildung in nhibernate nicht so, wie Sie denken, funktioniert es tut. Es ist so konzipiert, dass Sie zwei Klassen haben, die, wenn sie in ihre entsprechenden Tabellen die gleichen Primärschlüssel beibehalten.

Sie können aber es funktioniert, aber es ist nicht schön. Ich werde Ihnen zeigen, wie dann einige Alternativen bieten bis:

In Ihrer Transaktion hbml:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/>

in Ihrer Sequenz html:

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" />

Das sollte tun, was Sie wollen, es zu tun. Beachten Sie die Objekt-Nr.

Die nächste Frage, du gehst zu schreiben los ist, zu fragen, wie man ein träges Laden auf einer Eins-zu-Eins-Verbänden erhalten. Die Antwort ist, kann man nicht ... na ja können Sie, aber es wird wahrscheinlich nicht funktionieren. Das Problem ist, dass Sie Ihre Fremdschlüssel auf der Sequenztabelle, was bedeutet, dass nhibernate die Datenbank zu treffen hat, um zu sehen, wenn das Ziel vorhanden ist. Dann können Sie versuchen, mit dem Spielen um erzwungener = „true / false“, um zu sehen, wenn Sie es überzeugen können träge, um die Assoziation eines Eins-zu-Eins-zu laden.

Alles in allem, ist es in insgesamt Verschwendung von Zeit führen geht.

Ich schlage vor, entweder:

  1. Haben zwei many-to-one-Assoziationen.
  2. Haben Sie eine viele-zu-eins Zuordnung zu einer Sammlung am anderen Ende.

Das spart Ihnen eine Menge Kopfschmerzen auf lange Sicht.

Andere Tipps

Es stellte sich heraus, dass für meine Situation ein <join table> Mapping am besten funktioniert. Ich musste nur um sicher stellen, dass ich die Eigenschaften, die aus der zweiten Tabelle kamen, war Nullable-Typen, oder es würde ein Einsatz tut auf einmal speichern, wenn nichts geändert hatte. Da ich nicht faul Laden für die zweite Tabelle brauchte, das funktioniert großartig. Ich bin sicher, dass ich viele-zu-eins-Zuordnungen gepaart bekommen haben könnte zu arbeiten, aber es war nicht intuitiv und scheint komplizierter als die Tabellenoption beitreten, aber <join table> ist in NHibernate 2.0 oder höher zur Verfügung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top