2011-01-12 7 views
0

Angenommen, ich habe zwei persistente Klassen Cat und Hat. Stellen wir uns vor, dass die Beziehung zwischen den beiden bidirektional eins-zu-viele ist, da in einer Katze viele verschiedene Hüte vorkommen können, und wir können das Mapping in beide Richtungen durchlaufen. Um eine Assoziation zwischen einer Instanz jeder Klasse zu erstellen, sollte ich in der Lage sein, und mich zu korrigieren, wenn ich falsch bin, gehen Sie wie folgt vor:Erstellen und Abrufen verknüpfter Zuordnungen in NHibernate

Cat whiskers = new Cat(); 
Hat redHat = new Hat(); 
redHat.Id = 1; // normally assigned by generator but this makes example more explicit 
whiskers.Hats.Add(redHat); 
catService.Save(whiskers); 
hatService.Save(redHat); 

Vor diesem Hintergrund möchte ich nicht in der Lage sein, die Katze, die redHat zugeordnet ist, abrufen, indem Sie Folgendes tun?

Leider, wenn ich versuche, diese Technik zu verwenden, resultiert Katze als ein Null-Objekt in dieser letzten Zeile. Ich vermute, dass mir etwas in meiner Eins-zu-Viele-Zuordnung in Cat.hbm.xml fehlt, oder zumindest hoffe ich, dass es so einfach ist. Hier ist, was es sieht derzeit wie:

<set name="Hats" inverse="true"> 
    <key column="Id"/> 
    <one-to-many class="Hat"/> 
</set> 

ich keine Zuordnung in Hat.hbm.xml haben, da man in einer „doppelten mapping“ Fehler geführt hinzufügen. Ich habe den Hibernate documentation auf Zuordnungszuordnungen gelesen, kann aber immer noch nicht funktionieren. Was mache ich falsch?

komplette Mapping-Dateien unter:

Cat.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Domain" 
       namespace="Domain"> 

    <class name="Cat" table="cats" lazy="true"> 

    <id name="Id"> 
     <generator class="increment" /> 
    </id> 

    <property name="Name" /> 

    <set name="Hats" inverse="true"> 
     <key column="Id"/> 
     <one-to-many class="Hat"/> 
    </set> 

    </class> 

</hibernate-mapping> 

Hat.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Domain" 
       namespace="Domain"> 

    <class name="Hat" table="hats" lazy="true"> 

    <id name="Id"> 
     <generator class="increment" /> 
    </id> 

    </class> 

</hibernate-mapping> 

bearbeiten

Ich glaube, das Problem war, dass ich den Wert ISet<Hat> in der Cat-Klasse nicht initialisiert habe. Ich bin jedoch auf ein neues Problem gestoßen. Wenn ich versuche, die Verbände zugreifen, bekomme ich diesen Fehler:

Could not initialize proxy - no Session.

ich dies vermieden wird leicht dachte, wenn ich eine Methode in meinem DAO erstellt, wo ich es in einer Sitzung wie folgt wickeln könnte:

Dies ergibt den gleichen Fehler "keine Sitzung". Ich bin ratlos.

+1

können Sie Ihre vollständigen Zuordnungsdateien anzeigen? – MarioH

+0

@MarioH: Ich habe den Beitrag mit den vollständigen Mapping-Dateien aktualisiert. –

Antwort

0

Ich habe das Problem gelöst, indem ich einen SessionManager erstellt habe, der es mir erlaubt, eine Session zu öffnen, Transaktionen auszuführen und auf alle Collection-Proxys innerhalb des Session-Singletons zuzugreifen und dann die Session zu schließen.

0
  1. Sie müssen in Ihrer hat.hbm einen number-to-one-Eintrag hinzufügen. Ich denke, sollte funktionieren.

  2. Dann müssen Sie beide Seiten des Vereins eingestellt

    whiskers.Hats.Add (RedHat);

    redHat.Cat = Whiskers;

Ich denke, das sollte Ihre Probe arbeiten lassen.

Der Grund für Ihr Problem "keine Sitzung" ist, dass der Sammelproxy nur mit der Sitzung arbeitet, mit der er erstellt wurde. In Ihrem Beispiel funktioniert es nur mit der Sitzung, die Ihre Hat-Instanz erstellt hat. Es ist möglich, einen Proxy mit einer anderen Sitzung zu verbinden, dies wird jedoch im Allgemeinen nicht empfohlen, da dies komplexe Auswirkungen auf die Transaktionsgrenzen und die Datenkonsistenz hat.

+0

Ich habe ' 'zu Hat.hbm hinzugefügt, aber jetzt bekomme ich' Parameter Index ist außerhalb des Bereichs', wenn ich versuche zu persistieren ein Hut. Wenn Sie nur mit der Sitzung, mit der sie erstellt wurde, auf den Sammlungs-Proxy zugreifen können, wie gehen Sie dann beim Abrufen der zugeordneten Zuordnungen eines Objekts vor? –

+0

Sie müssen einen anderen Namen für die Spalte verwenden, da sie bereits für pk verwendet wird. benutze etwas wie "cat_id" und es wird funktionieren. – MarioH

Verwandte Themen