threw org open method lazyinitializationexception cannot nhibernate proxy lazy-evaluation

org - opciones de carga perezosa nhibernate



hibernate open session in view spring (4)

De forma predeterminada, Hibernate3 usa la recuperación de selección de recuperación lenta para las colecciones y la recuperación de proxy diferida para las asociaciones de un solo valor. Estos valores predeterminados tienen sentido para la mayoría de las asociaciones en la mayoría de las aplicaciones.

http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy

¿Cuál es la diferencia entre lazy="true" y lazy="proxy" en nhibernate?


Sospecho que otra forma de pensarlo sería esto.

class Foo { public virtual Bar SingleBar { get; set; } public virtual ICollection<Bar> MultiBar { get; set; } }

  • lazy = "proxy" se aplica a objetos individuales (es decir, foo.SingleBar)
  • lazy = "true" se aplica a colecciones de objetos (es decir, foo.MultiBar)

(No puede establecer lazy = "proxy" en una colección, ni puede establecer lazy = "true" en una sola referencia. O hará que NH arroje una XmlSchemaException que es un poco críptica para los principiantes).

Operativamente, hacen lo mismo abstracto: cuando y solo cuando se accede a la propiedad, NHibernate accede a la base de datos y completa la propiedad.

Sin embargo, hay una ligera diferencia en la implementación debido a lo que se necesita para recuperar los objetos (en el caso individual, el ID de referencia (Bar) se cargó con la entidad principal (Foo). En el caso de recopilación, los identificadores son desconocidos y deben ser encontrado en otra mesa)


La referencia de documentación dice que el valor del atributo proxy está en:

lazy="proxy|no-proxy|false"

perezosa (opcional, por defecto es proxy): por defecto, las asociaciones de un solo punto son aproximadas.

lazy = "no-proxy" especifica que la propiedad debe buscarse de forma diferida cuando se accede por primera vez a la variable de instancia (requiere instrumentación de bytecode de compilación).

lazy = "false" especifica que la asociación siempre será buscada con entusiasmo.


lazy = "proxy" significa que NHibernate inicializará las instancias de su clase de forma perezosa; Cuando NHibernate recupera una instancia de su clase de la base de datos, en este caso, no devolverá una instancia ''real'' de su clase, sino que le dará un proxy. Es decir, devolverá un objeto que sea de otro tipo, más específicamente, un objeto que sea una subclase de su clase (generada por NHibernate a través de la generación IL).

El objeto que se le dará, es un proxy, y la única propiedad poblada es la propiedad Id. Tan pronto como llame a otra propiedad en la instancia, NHibernate inicializará el proxy y recuperará todas las otras propiedades / colecciones (excepto aquellas que están cargadas de forma diferida) de la base de datos.

Lazy = "true" se usa en otro nivel. Mientras que lazy = "proxy" se usa en el nivel de clase, lazy = "true" se usa en el nivel de colección. Significa que la colección debe estar cargada de forma lenta.