Question

une entreprise, je travaille pour un ERP utilise et base de données existante de c'est Oracle. Jusqu'à présent, je l'ai utilisé paquets (procédures stockées Oracle) aux données d'accès, mais au cours des années, le nombre a augmenté de manière constante et maintenant je ne peux pas les gérer plus.
Je suis en train de faire des expériences avec NHibernate et a commencé à cartographier quelques tables.
Toutes les tables ont des clés composites. Une brève description:

Tableau de commande (nom de la table: OCSAORH )

OCHORDN ( PK ) => OrderNumber
OCHAMND ( PK )
OCHCOSC ( PK ) => Entreprise
OCHCLII
...

Tableau OrderLine (nom de la table: OCSALIN )

OCLORDN ( PK ) => OrderNumber
OCLAMND ( PK )
OCLCOSC ( PK ) => Entreprise
OCLLINN ( PK ) => Numéro de ligne
OCLSSEQ ( PK )
OCLITMN
...

Ceci est mon mapping

Commander :

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

tout fonctionne bien avec ces correspondances; Je peux charger une commande et les charges de chargement paresseux mes lignes. En lisant certains documents, je l'ai remarqué que je ne l'ai pas défini le nombre à une relation, donc j'ai ajouté ceci:

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

au fichier de mappage OrderLine.
Maintenant, si je lance mon application de test de l'ordre est correctement chargé, mais les lignes de commande ne sont pas chargées.
Je reçois un {} = {NHibernate.ADOException "n'a pas pu initialiser une collection ...} J'ai essayé d'enquêter et a remarqué que la requête générée pour récupérer les lignes est erroné. Ceci est le 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=?

Comme vous pouvez remarquer les 3 derniers champs de la sélection (ceux avec le préfixe OCH au lieu de OCL) ne sont pas membres de la table de OCSALIN; ils sont la clé de la OCSAORH.
Après 1 jours passés documentation et des exemples de lecture, je ne peux pas comprendre ce que je fais mal.
Est-ce qu'il ya quelqu'un là-bas qui peut essayer d'aider?

Était-ce utile?

La solution

Ceci est le comportement attendu. Vous définissez les clés étrangères dans votre many-to-one mapping. Ainsi, les colonnes doivent exister dans l'objet que vous définissez.

Je pense que vous voulez que ce

<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>   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top