Question

Dire que j'ai deux classes persistantes Cat et Hat. Imaginons que la relation entre les deux est un bidirectionnellement à plusieurs, comme dans un chat peut avoir de nombreux chapeaux, et nous pouvons traverser la mise en correspondance dans les deux sens. Afin de créer une association entre une instance de chaque classe, je devrais pouvoir et me corriger si je me trompe, procédez comme suit:

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

Avec cela à l'esprit, je ne devrais pas être en mesure de récupérer le chat qui est associé à RedHat en procédant comme suit?

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

Malheureusement, lorsque je tente d'utiliser cette technique, les résultats de chat comme un objet nul dans cette dernière ligne. Je devine que je manque quelque chose dans mon one-to-many mapping Cat.hbm.xml, ou du moins je l'espère quelque chose est aussi simple que cela. Voici ce qu'il ressemble actuellement:

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

Je n'ai pas de correspondance dans Hat.hbm.xml depuis l'ajout d'un a entraîné une erreur « mappage double ». J'ai lu la mise en veille prolongée documentation sur les correspondances d'association, mais ne peut toujours pas obtenir ce travail. Qu'est-ce que je fais mal?

Les fichiers cartographiques complets ci-dessous:

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>

Modifier

Je crois que le problème était que je ne la valeur Initialisation ISet<Hat> dans la classe Cat. Cependant, j'ai rencontré un nouveau problème. Lorsque je tente d'accéder aux associations, je reçois cette erreur:

Could not initialize proxy - no Session.

je me suis dit ce serait facilement évité si je créé une méthode dans mon DAO où je pouvais envelopper dans une session comme ceci:

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

Cela donne la même erreur « pas de session ». Je suis perplexe.

Était-ce utile?

La solution 2

Je résolu le problème en créant un SessionManager qui me permet d'ouvrir une session, effectuer toutes opérations et l'accès des procurations de collecte au sein de la session singleton, puis fermez la session.

Autres conseils

  1. Vous devez ajouter une entrée beaucoup à un dans votre hat.hbm. Je pense que devrait fonctionner.

  2. Ensuite, vous devez définir les deux côtés de l'association

    whiskers.Hats.Add (RedHat);

    redHat.Cat = whiskers;

Je pense que cela devrait rendre votre travail exemple.

La raison de votre problème « pas de session » est que le proxy de collecte fonctionne uniquement avec la session, il a été créé. Donc, dans votre exemple, il fonctionne uniquement avec la session qui a créé votre instance Hat. Il est possible de connecter un proxy avec une autre session, mais qui est généralement pas recommeded, car elle a des implications complexes sur les limites des transactions et la cohérence des données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top