2010-01-18 32 views
7

estoy desarrollando una aplicación que usa Wicket como la capa de vista y JPA (Hibernate) como ORM. construir la interfaz de usuario ha sido divertido (incluso con ajax) usando Wicket. Mi problema proviene de la integración de los objetos persistentes en las páginas de edición (las páginas de solo lectura no son un problema con un LoadadableDetachableModel).Cómo deshacerse de LazyInitializationException con la integración de Wicket JPA/Hibernate (con Spring)

Estoy usando el filtro OSIV de la primavera para proporcionar una sesión abierta para la vista. Pero, como mantengo los objetos de dominio (las clases mapeadas @Entity) en las páginas de edición, obtengo el temido exceso de carga Lazy cuando accedo a propiedades de ellos en ajax callbacks.

Realmente no quiero ir por la carretera DTO/VO, ya que creo que solo inflaría el código y me obligaría a escribir muchos códigos de placa de caldera.

Una idea era utilizar los objetos de modelo en la vista, fusionar el objeto pasado en la sesión de hibernación actual y acceder a todos los getters para inicializar completamente el objeto. después de esto, el objeto se almacenará en la vista (sion) y se despegará. Al guardarlo, volvería a fusionarlo y confirmar el cambio.

¿Esta sería una manera recomendada? ¿Hay mejores soluciones? Por extraño que parezca, la mayoría de los libros/blogs/howtos ignoran por completo ese problema.

¿Qué gestión de transacción sugeriría? Ahora mismo uso @Transaction en la capa de servicio. ¿Cómo cambiaría eso si utilizo otras formas de acceder al almacenamiento de datos en las sesiones de hibernación?

Cualquier punteros/Enlaces son bienvenidos como estoy un poco perdido aquí ..

gracias de antemano

+0

he editado el título de la pregunta de manera que refleje la verdadera pregunta – Bozho

+0

gracias por el enlace. Empecé a cavar en la fuente/javadoc. se ve muy bien hasta ahora. incluso sabía sobre WicketRAD, pero de alguna manera se me escapó al pensar en este problema. – bert

Respuesta

6

Esta entrada de blog (que entra en los detalles de LDM) me dio algunas buenas ideas, especialmente para editar escenarios:

Building a smart EntityModel

Fwiw que tenía muy buenos resultados usando un RequestCycle personalizado (como se sugiere en el sección de comentarios del enlace anterior) en PerfBench y puede encontrar el código here. IIRC es una simplificación del enfoque (OpenSessionInView/London Wicket) del enlace que Bozho publicó.

3

This es una breve presentación sobre OpenSessionInView con Wicket.

Si se utiliza correctamente, el enfoque OpenSessionInView debe garantizar que no se produzca LazyInitializationException.

0

Si utiliza LoadadableDetachableModel's que no pasa a un componente como modelo, wicket no llamará a .detatch() en ellos, y a menudo tampoco se serializarán, por lo que tendrán datos viejos y arrojarán el excepción perezosa

Asegúrese de pasar siempre LDM a un componente, o sepárelo usted mismo.

1

Finalmente tuve tiempo de trabajar en ese problema de nuevo. No sé cómo podría haber pasado por alto la solución simple;)

Desarrollamos nuestra propia implementación UIFormModel de Wickets IModel Interface. Como quería mantener la entrada del usuario durante las solicitudes http, no hice nada en la llamada detach(), manteniendo (y serializando) el objeto modelo en su estado completo.

único que tenía que añadir fue una bandera que se desprenden() se llama y compruebe que el indicador en el método getObject(). Si se estableció el indicador, hago un EntityManager.merge() y tengo un modelo reinserido que puedo usar en los componentes de la interfaz de usuario.

Gracias a todos por su entrada

Cuestiones relacionadas