Frage

sagen, ich habe zwei persistente Klassen Cat und Hat. Stellen wir uns vor, dass die Beziehung zwischen den beiden ist, in zwei Richtungen eine Eins-zu-viele, wie bei einer Katze kann viele verschiedene Hüte haben, und wir können die Zuordnung in beide Richtungen durchlaufen. Um eine Assoziation zwischen einer Instanz jeder Klasse zu erstellen, soll ich in der Lage sein, und mich korrigieren, wenn ich falsch bin, gehen Sie wie folgt vor:

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

Mit dem im Verstand, soll ich nicht in der Lage sein, um die Katze zu holen, die mit RedHat zugeordnet ist, durch die folgenden tun?

Hat hat = hatService.FindById(1); // redHat has Id 1
Cat cat = hat.Cat; // cat should be whiskers

Leider, wenn ich versuche, diese Technik zu verwenden, Katze Ergebnisse als ein Null-Objekt in der letzten Zeile. Ich vermute, ich bin etwas fehlt in meinem one-to-many-Mapping in Cat.hbm.xml oder zumindest ich es ist etwas, das einfach hoffen. Hier ist, was es sieht derzeit wie:

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

Ich habe keine Zuordnung in Hat.hbm.xml da eine Zugabe in einer „doppelten Mapping“ Fehler. Ich las die Hibernate Dokumentation auf Assoziationszuordnungen, kann aber immer noch nicht diese Arbeit bekommen. 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 nicht den ISet<Hat> Wert in der Klasse Cat wurde initialisiert. Allerdings habe ich in ein neues Problem laufen. Wenn ich versuche, die Verbände zuzugreifen, ich diesen Fehler:

Could not initialize proxy - no Session.

ich dachte, das wäre leicht vermieden werden, wenn ich eine Methode in meinem DAO erstellt, wo ich es in einer Sitzung wie folgt wickeln könnte:

public Cat GetRelatedCat(Hat hat)
{
    Cat cat;
    using (ISession session = HibernateUtil.GetSessionFactory().OpenSession())
    {
        cat = hat.Cat;
    }
    return cat;
}

Dies ergibt das gleiche „keine Sitzung“ Fehler. Ich bin ratlos.

War es hilfreich?

Lösung 2

Ich löste das Problem, indem ein Sessionmanager zu schaffen, die mir eine Session öffnen können, führen Sie alle Transaktionen und Zugang zu den Sammel Proxies innerhalb der Singleton Session, und schließen Sie die Session.

Andere Tipps

  1. Sie müssen einen many-to-one-Eintrag in Ihrem hat.hbm hinzuzufügen. Ich denke, sollte funktionieren.

  2. Dann müssen Sie beiden Seiten des Vereins gesetzt

    whiskers.Hats.Add (RedHat);

    redHat.Cat = Whisker;

ich denke, das sollte Ihre Probe Arbeit machen.

Der Grund für die „keine Sitzung“ Problem ist, dass die Sammlung Proxy funktioniert nur mit der Sitzung es erstellt wurde. Also in Ihrem Beispiel funktioniert es nur mit der Sitzung, die Ihren Hut Instanz erstellt. Es ist möglich, einen Proxy mit einer anderen Sitzung zu verbinden, aber das ist in der Regel nicht recommeded, weil sie komplexe Auswirkungen auf den Transaktionsgrenzen und Datenkonsistenz hat.

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