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.
können Sie Ihre vollständigen Zuordnungsdateien anzeigen? – MarioH
@MarioH: Ich habe den Beitrag mit den vollständigen Mapping-Dateien aktualisiert. –