2008-12-23 11 views
15

Las relaciones uno a uno dentro de nhibernate pueden cargarse como "falso" o "proxy". Me preguntaba si alguien sabe cómo hacer un mapeo perezoso de uno a uno.NHibernate: cómo habilitar la carga diferida en el mapeo de uno a uno

Desarrollé un truco para lograr el mismo resultado utilizando un conjunto vago mapeado en un campo privado y haciendo que la propiedad pública devuelva el primer resultado de ese conjunto. Funciona, pero no es el código más limpio ...

¡Gracias de antemano!

Respuesta

20

La carga diferida de uno a uno no se admite a menos que la asociación sea obligatoria. Ver here para el razonamiento.

Se reduce al hecho de que para decidir si existe el otro lado de la relación (N) Hibernate debe ir a la base de datos. Como ya ha tomado la base de datos, también puede cargar el objeto completo.

Si bien hay casos donde golpear la base de datos solo para ver si el objeto relacionado existe sin realmente cargar el objeto tiene sentido (si el objeto relacionado es muy "pesado"), NHibernate no lo admite actualmente.

+0

¿Qué quiere decir con "a menos que la asociación sea obligatoria"? – cbp

+12

¿Y qué pasa si el 90% del tiempo ni siquiera va a acceder a la base de datos para ver si existe porque no se usa? Los desarrolladores conocen mejor su uso personal que NHibernate, algo así debería ser respaldado. – BradLaney

+0

@BradLaney, en el lado no restringido = "verdadero", la carga diferida a través de la corrección no puede funcionar como se explica en el enlace de Sean. Pero desde [principios de 2010] (https://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations), lazy = "no-proxy" es compatible con uno-a-uno y muchos -a uno. Con esta opción, la carga diferida funciona en el lado no restringido (probado con NH 4) al consultarlo (no en el caso de carga directa: búsqueda aún ansiosa). Sin embargo, esto hace que la entidad raíz se defina en lugar de la entidad relacionada, para permitir interceptar la llamada a la propiedad de la entidad relacionada y cargarla de forma perezosa. –

4

Por lo que yo sé, no hay una forma no hacky de cargar de forma perezosa uno a uno. Espero estar equivocado, pero la última vez que lo revisé fue el caso.

+4

¿Algún avance en 2015 se refiere a este tema? –

+0

'lazy =" no-proxy "' es compatible desde [enero de 2010] (https://ayende.com/blog/4378/nhibernate-new-feature-no-proxy-associations), por otra razón, pero por el way habilita la carga diferida en el lado no "restringido" (atestiguado con NH 4). (La carga lenta fue admitida por mucho tiempo en el lado 'restringido', pero muchas personas no entienden el punto. Consulte esta [respuesta] (/ a/389345/1178314). –

3

Hay pensamiento de la manera. Es descrito here en detalles:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTest" namespace="NHibernateTest"> 
    <class name="Person" > 
    <id name="PersonID" type="Int32"> 
     <generator class="identity" /> 
    </id> 
    <property name="LastName" type="String" length="50" /> 
    <property name="FirstName" type="String" length="50" /> 
    <many-to-one name="Photo" class="PersonPhoto" /> 
    </class> 

    <class name="PersonPhoto"> 
    <id name="PersonID" type="Int32"> 
     <generator class="foreign"> 
     <param name="property">Owner</param> 
     </generator> 
    </id> 
    <property name="Photo" type="BinaryBlob" /> 
    <one-to-one name="Owner" class="Person" constrained="true" /> 
    </class> 
</hibernate-mapping> 
+0

Hola, Artem, ¿conocías tu pregunta acerca de que "Flash Media Server no llama a la aplicación.con controlador de Disconnect?" fué borrado ? (http://stackoverflow.com/questions/359727) Todavía puedo verlo debido a mi nivel de representante. ¿Quieres que escriba una entrada de usuario que solicite su restauración? – VonC

+0

Huh. General (ist) está en warpath :) Vamos, VonC, tómalo con calma. Todavía hay su descargo de responsabilidad en la parte superior de su respuesta. Fue una jugada justa.Gracias por su honestidad. –

+0

Esto no funciona (incluso cuando se especifica la columna, según la respuesta de David Yates). En varias situaciones, NHibernate se confunde mucho. – cbp

1

Probé el ejemplo utilizado por Artem Tikhomirov anteriormente. Seguí recibiendo un error de que la columna de Foto no existe. Después de mirar this, descubrí que el mapeo había desaparecido un poco. Cuando cambié el mapeo muchos-a-uno para especificar el nombre de la columna así:

muchos-a-uno name = columna "Foto" = clase "PersonaID" = "PersonPhoto" única = "true"

Lo tengo para trabajar. Espero que esto ayude a alguien: o)

Cuestiones relacionadas