Frage

ein Unternehmen arbeite ich für unter Verwendung eines ERP und Vermächtnis Datenbank ist Oracle. Bis jetzt habe ich Pakete (Oracle Stored Procedures) den Zugriff auf Daten verwendet, aber im Laufe der Jahre hat sich die Zahl gewachsen konsequent und jetzt kann ich sie nicht mehr verwalten.
Ich habe versucht, einige Experimente mit Nhibernate zu tun und begann Abbilden paar Tische.
Alle Tische haben Composite Primärschlüssel. Eine kurze Beschreibung:

Tabelle Order (Tabellenname: OCSAORH )

OCHORDN ( PK ) => Auftragsnummer
OCHAMND ( PK )
OCHCOSC ( PK ) => Unternehmen
OCHCLII
...

Tabelle Orderline (Tabellenname: OCSALIN )

OCLORDN ( PK ) => Auftragsnummer
OCLAMND ( PK )
OCLCOSC ( PK ) => Unternehmen
OCLLINN ( PK ) => Line Number
OCLSSEQ ( PK )
OCLITMN
...

Das ist mein Mapping

Auftrag :

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MvcOracleNhibernate"
                   namespace="MvcOracleNhibernate.Domain">
  <class name="Order" table="OCSAORH">
    <composite-id>
      <key-property name="Number" column="OCHORDN"></key-property>
      <key-property name="Ver" column="OCHAMND"></key-property>
      <key-property name="Company" column="OCHCOSC"></key-property>
    </composite-id>
    <property name="CustomerCode" column="OCHCLII" type="String" length="10"></property>
    <property name="Reference" column="OCHOCNO" type="String" length="25"></property>
    <property name="Date" column="OCHOCDT" type="Double"></property>
    <bag name="OrderLines" cascade="all-delete-orphan" generic="true" inverse="true" lazy="false">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true"/>
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found="ignore"/>
    </bag>
  </class>
</hibernate-mapping>

Orderline :

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MvcOracleNhibernate"
                   namespace="MvcOracleNhibernate.Domain">
  <class name="OrderLine" table="OCSALIN">
    <composite-id>
      <key-property name="Number" column="OCLORDN"></key-property>
      <key-property name="Ver" column="OCLAMND" ></key-property>
      <key-property name="Company" column="OCLCOSC"></key-property>
      <key-property name="Line" column="OCLLINN"></key-property>
      <key-property name="Seq" column="OCLSSEQ"></key-property>
    </composite-id>
    <property name="Item" column="OCLITMN" type="String" length="19"></property>
    <property name="Quantity" column="OCLQTYP" type="Double"></property>
  </class>
</hibernate-mapping>

Mit diesen Zuordnungen alles funktioniert; Ich kann einen Auftrag und der verzögertes Laden lädt meine Zeilen laden. Während eine Dokumentation zu lesen habe ich bemerkt, dass ich nicht die Viele-zu-Eins-Beziehung definiert haben, so dass ich diese hinzugefügt haben:

<many-to-one name="Order" class="Order" lazy="proxy">
  <column name="OCHORDN" not-null="true"/>
  <column name="OCHAMND" not-null="true"/>
  <column name="OCHCOSC" not-null="true"/>
</many-to-one>   

auf die Orderline-Mapping-Datei.
Nun, wenn ich meinen Test-App ausgeführt wird, die Reihenfolge geladen richtig, aber die Auftragszeilen werden nicht geladen.
Ich erhalte eine {NHibernate.ADOException} = { "konnte nicht eine Sammlung initialisieren: ...} Ich habe versucht, zu untersuchen und festgestellt, dass die erzeugte Abfrage, um die Zeilen abzurufen falsch ist. Dies ist die SQL:

SELECT 
    orderlines0_.OCLORDN as OCLORDN1_, 
    orderlines0_.OCLAMND as OCLAMND1_, 
    orderlines0_.OCLCOSC as OCLCOSC1_, 
    orderlines0_.OCLLINN as OCLLINN1_, 
    orderlines0_.OCLSSEQ as OCLSSEQ1_, 
    orderlines0_.OCLORDN as OCLORDN13_0_, 
    orderlines0_.OCLAMND as OCLAMND13_0_, 
    orderlines0_.OCLCOSC as OCLCOSC13_0_, 
    orderlines0_.OCLLINN as OCLLINN13_0_, 
    orderlines0_.OCLSSEQ as OCLSSEQ13_0_, 
    orderlines0_.OCLITMN as OCLITMN13_0_, 
    orderlines0_.OCLQTYP as OCLQTYP13_0_, 
    orderlines0_.OCHORDN as OCHORDN13_0_, 
    orderlines0_.OCHAMND as OCHAMND13_0_, 
    orderlines0_.OCHCOSC as OCHCOSC13_0_ 
FROM OCSALIN orderlines0_ 
WHERE 
    orderlines0_.OCLORDN=? 
    and orderlines0_.OCLAMND=? 
    and orderlines0_.OCLCOSC=?

Wie Sie die letzten drei Felder der Auswahl feststellen können (die mit dem Präfix OCH statt OCL) sind nicht Mitglieder der OCSALIN Tabelle; sie sind der Schlüssel des OCSAORH.
Nach 1 Tag verbrachte Dokumentation und Beispiele Lesen kann ich nicht herausfinden, was ich falsch mache.
Gibt es jemanden gibt, die helfen können versuchen?

War es hilfreich?

Lösung

Dies ist das erwartete Verhalten. Sie definieren die Fremdschlüssel in einer Viele-zu-Eins-Abbildung. So sind die Spalten in dem Objekt existieren müssen Sie definieren.

Ich glaube, Sie wollen diese

<many-to-one name="Order" class="Order" lazy="proxy">
  <column name="OCLORDN" not-null="true"/>
  <column name="OCLAMND" not-null="true"/>
  <column name="OCLCOSC" not-null="true"/>
</many-to-one>   
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top