2012-01-12 18 views
5

estamos utilizando hibernate con bloqueo optimista. Todas nuestras entidades tienen la anotación @version.mejor estrategia de actualización en hibernación stalestateException

Esto funciona bien, si un usuario intenta salvar un objeto que está obsoleto obtenemos una excepción de estado estable. En nuestro caso, nos gustaría dar al usuario una pantalla de notificación para descartar sus cambios o sobrescribir los valores actuales en la base de datos.

Este es un caso de uso común para excepciones de estados obsoletos. Mi pregunta está relacionada con este caso de uso. ¿Cuál es la mejor estrategia si el usuario decide sobreescribir la fila de la base de datos actual con sus cambios? He revisado la guía de referencia de Hibernate y diferentes sitios web, pero todo lo que se menciona aquí es el hecho de que tiene que captar usted mismo la excepción stalestateexperience y luego gestionar de forma programática la sobrescritura de los datos. Me pregunto si hibernate tiene algunas utilidades para simplificar esta estrategia, lo más simple que puedo hacer si el usuario decide sobreescribir sus datos es recuperar la última versión de la entidad de la base de datos y luego copiar todos los campos modificados a este objeto y luego guardando el objeto cambiado nuevamente en la base de datos. Pero no puedo dejar de preguntarme si no hay una solución más elegante.

Respuesta

1

No creo que Hibernate intente ayudarlo con esto porque los requisitos en esta área probablemente sean muy complejos y personalizados.

Supongo que si un usuario guardara un objeto que ha sido cambiado simultáneamente por otro usuario, lo más probable es que no quiera simplemente cargar el objeto y copiar todos los campos modificados y deshacer todos los demás cambios de usuarios . ¿Qué sucede si ambos usuarios cambiaron el mismo campo? Es posible que desee presentar las dos versiones al usuario y pedirles que decidan qué versión es la correcta. Un poco como fusionar cambios en un sistema de control de versiones.

También podría tener validación de nivel de IU que vincule los campos que podrían violarse si simplemente fusiona dos versiones de la misma entidad en el servidor y lo conserva.

+0

En algunas ocasiones, efectivamente creamos un 'merge ui'. Pero hay algunos casos de uso en los que los datos no son lo suficientemente importantes como para sobrescribirlos, me preguntaba si hay algún método predeterminado para esto o si solo tiene que escribir el algoritmo usted mismo. –

+0

No es que yo sepa que tengo miedo. –

+1

Sin embargo, es una buena pregunta. ¡He pasado bastante tiempo pensando en la mejor forma de enfrentar esta situación! –

0

En mi experiencia, para introducir algo de automatización en este caso solía hacer el siguiente truco. Recargué la entidad y establecí el valor de la última versión de la misma en mi objeto obsoleto que no había podido guardar antes. Luego hice merge() pasando mi objeto obsoleto. De esta forma, todos los campos se sobrescriben, la versión está actualizada y lista para guardarse. Por supuesto, todas las referencias asociadas deben tenerse en cuenta de la misma manera.

Cuestiones relacionadas