Pregunta

decir que tengo dos clases persistentes Cat y Hat. Imaginemos que la relación entre los dos es bidireccional uno-a-muchos, como en un gato puede tener muchos sombreros diferentes, y podemos atravesar la asignación en ambas direcciones. Con el fin de crear una asociación entre una instancia de cada clase, yo debería ser capaz de, y corrígeme si me equivoco, haga lo siguiente:

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 esto en mente, debería no ser capaz de recuperar el gato que se asocia con RedHat haciendo lo siguiente?

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

Por desgracia, cuando trato de utilizar esta técnica, los resultados de gato como un objeto nulo en la última línea. Supongo que me falta algo en el mapeo de uno a muchos en Cat.hbm.xml, o por lo menos espero que sea algo tan simple. Esto es lo que se ve actualmente como:

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

I tiene ninguna asignación en Hat.hbm.xml desde la adición de uno resultó en un error de "mapeo duplicado". He leído el Hibernate documentación en las asignaciones de asociación, pero todavía no puede conseguir este trabajo. ¿Qué estoy haciendo mal?

archivos de mapeo completo a continuación:

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>

Editar

Creo que el problema era que no estaba inicializando el valor ISet<Hat> en la clase de gato. Sin embargo, me he encontrado un nuevo problema. Cuando intento acceder a las asociaciones, me sale este error:

Could not initialize proxy - no Session.

Me cuenta de esto se podría evitar fácilmente si he creado un método en mi DAO donde podría envolverlo en una sesión de la siguiente manera:

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

Esto produce el mismo error "no hay ninguna sesión". Estoy confundido.

¿Fue útil?

Solución 2

Me solucionó el problema mediante la creación de un SessionManager que me permite abrir una sesión, realice cualquier transacción y el acceso de los proxies de recogida dentro de la Sesión Singleton, y luego cerrar la sesión.

Otros consejos

  1. Es necesario añadir una entrada de muchos-a-uno en su hat.hbm. Creo que debería funcionar.

  2. A continuación, usted tiene que fijar ambos lados de la asociación

    whiskers.Hats.Add (RedHat);

    redHat.Cat = bigotes;

Creo que esto debería hacer su trabajo de la muestra.

La razón de su problema "no hay ninguna sesión" es, que el proxy colección sólo funciona con la sesión de la que fue creado. Así que en su ejemplo sólo funciona con la sesión que creó la instancia de sombrero. Es posible conectar un proxy con otra sesión, pero que generalmente no se recommeded, porque tiene implicaciones complejas en los límites de transacción y consistencia de los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top