Domanda

Di 'Ho due classi persistenti Cat e Hat. Immaginiamo che il rapporto tra i due è bidirezionale uno-a-molti, come in un gatto può avere molti cappelli diversi, e siamo in grado di attraversare la mappatura in entrambe le direzioni. Al fine di creare un'associazione tra un'istanza di ogni classe, dovrei essere in grado di, e correggimi se sbaglio, procedere come segue:

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

Con questo in mente, dovrebbe non essere in grado di recuperare il gatto che è associato con RedHat facendo quanto segue?

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

Purtroppo, quando cerco di utilizzare questa tecnica, i risultati gatto come un oggetto nullo in quella ultima riga. Sto indovinando che mi manca qualcosa nella mia mappatura uno-a-molti in Cat.hbm.xml, o almeno spero che sia una cosa così semplice. Ecco quello che attualmente appare come:

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

Non ho mappatura Hat.hbm.xml poiché l'aggiunta di uno ha provocato un errore di "mapping duplicato". Ho letto il Hibernate documentazione sulle mappature di associazione, ma ancora non può ottenere questo lavoro. Che cosa sto facendo di sbagliato?

I file mappatura completa qui sotto:

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>

Modifica

Credo che il problema era che non ero l'inizializzazione il valore ISet<Hat> nella classe Cat. Tuttavia, ho incontrato un nuovo problema. Quando provo ad accedere alle associazioni, ottengo questo errore:

Could not initialize proxy - no Session.

ho pensato che questo sarebbe essere facilmente evitato se ho creato un metodo nel mio DAO dove ho potuto avvolgerla in una sessione in questo modo:

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

Questo produce lo stesso errore "nessuna sessione". Sono perplesso.

È stato utile?

Soluzione 2

ho risolto il problema creando un SessionManager che mi permette di aprire una sessione, effettuare tutte le transazioni e l'accesso deleghe di raccolta all'interno del Singleton sessione, e quindi chiudere la sessione.

Altri suggerimenti

  1. È necessario aggiungere una voce di molti-a-uno nel vostro hat.hbm. Penso che dovrebbe funzionare.

  2. Poi si deve impostare entrambi i lati della associazione

    whiskers.Hats.Add (RedHat);

    redHat.Cat = baffi;

Credo che questo dovrebbe rendere il lavoro del campione.

Il motivo per il vostro problema "nessuna sessione" è, che la delega di raccolta funziona solo con la sessione è stato creato con. Quindi nel tuo esempio, funziona solo con la sessione che ha creato l'istanza Hat. E 'possibile collegare un proxy con un'altra sessione, ma che non è generalmente recommeded, perché ha implicazioni complesse sui confini delle transazioni e la coerenza dei dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top