hibernate - type - JPA: ¿qué implementaciones admiten la carga diferida fuera de las transacciones?
transaction with jta (3)
EclipseLink puede cargar relaciones vagas en las entidades incluso después de que el administrador de entidades que las ha creado ya no esté disponible. Con Hibernate esto no funciona , o al menos no lo hizo en el momento de esa publicación.
¿Qué hay de otros proveedores? OpenJPA y DataNucleus en particular?
¿Cuáles son las desventajas de esto (excepto una implementación más compleja)?
Si no tiene EntityManager, no tiene conocimiento del almacén de datos, el EMF ni nada. Entonces, no, no puedes hacer cargas perezosas (aparte de incorporar esa información en tu objeto) si quieres ser portátil ... es decir, que está fuera de las especificaciones de JPA.
DataNucleus JPA funcionará perfectamente realizando una carga lenta de campos fuera de las transacciones. Obviamente, debe indicar si se está ejecutando con TRANSACTION o EXTENDED persistence context , porque en el primer caso, los objetos se ADJUNTAN en la confirmación de la transacción (y no se puede cargar de forma diferida una vez separados), y en este último los objetos permanecen. ADMINISTRADO (y puedes cargar lazy en esa situación).
Tenga en cuenta que Hibernate 4.1.6 agregó soporte para cargar datos vagos fuera de las transacciones a través de la propiedad de hibernate.enable_lazy_load_no_trans
JPA.
No parece ser ampliamente utilizado / conocido - la única documentación oficial parece ser un ticket de función - por lo que probablemente valga la pena aplicar cierta precaución.
En mi experiencia (limitada), en general parece funcionar bien, excepto que no parece captar entidades en el lado "mapeado" de las relaciones bidireccionales.
Aunque Hibernate requiere que el mismo EntityManager esté disponible para cargar objetos de forma perezosa, es fácil lograr una carga diferida flexible con Open Session en View Pattern . En esencia, mantienes el EntityManager abierto todo el tiempo que lo necesites. Desarrollé aplicaciones del lado del cliente que mantienen abierto el mismo EntityManager siempre que la aplicación esté abierta. Esto le daría esencialmente el mismo comportamiento descrito en el artículo. Sin embargo, es ciertamente más difícil de implementar que la carga de perezoso "romana" que Roman describe.
Dicho todo esto, hay desventajas de la carga perezosa . El desarrollador debe conocer su estrategia de búsqueda y debe ser capaz de diferenciar cuándo y dónde cada estrategia es más aplicable. De lo contrario, puede terminar con problemas graves de rendimiento, como el problema de selección N + 1 . Además, siempre existe la posibilidad de que obtenga una excepción de base de datos durante la representación de la vista.
Acerca de OpenJPA y DataNucleus: aunque nunca he usado ninguno, esta publicación indica que OpenJPA también requiere un OpenSessionInViewFilter
para la carga diferida. Esta respuesta SO y esta publicación en el foro indican que DataNucleus requiere un OpenPersistenceManagerInViewFilter
para la carga diferida.