¿Cómo utilizar la propiedad de la versión de bloqueo optimista de Hibernate en la parte frontal?

El bloqueo optimista utilizando el atributo de versión para una entidad funciona bien y es fácil de implementar:

<version property="VERSION" type="int" column="EX_VERSION" />

La entidad tiene una propiedad del siguiente tipo:

private int VERSION;
public int getVERSION() { return VERSION; }
public void setVERSION(int VERSION) { this.VERSION = VERSION; }

Hasta ahora tan bueno. Ahora los métodos de servicio devuelven un objeto de transferencia de datos (DTO) para la entidad anterior, que las vistas muestran en HTML. Para las páginas de actualización, el atributo VERSIÓN se almacena en un campo oculto HTML y se envía con el formulario.

La intención es usar la propiedad de la versión para garantizar que la actualización de un usuario fallará si la información que se muestra va acompañada de una versión anterior.

El controlador responde a una solicitud de actualización de los usuarios invocando un método de servicio con el DTO que contiene la información actualizada (incluida la propiedad de la versión), y el método de servicio a su vez utiliza un objeto de acceso a datos (DAO) para persistir los cambios:

public void update(SimpleDTO dto) {
    SimplyEntity entity = getSimpleDao().load(dto.getId());
    copyProperties(dto, entity); // all properties, including VERSION copied to entity
    getSimpleDao().update(entity);
}

El problema es que la propiedad de versión copiada en la entidad por copyProperties (...) no es respetada por Hibernate. Busqué la razón en el siguiente foro:https://forum.hibernate.org/viewtopic.php?f=1&t=955893&p=2418068

En resumen, cuando se llama a load (), Hibernate almacena en caché la propiedad de la versión en el caché de la sesión y no importa a qué valor se cambie posteriormente. Estoy de acuerdo en que este es el comportamiento correcto, pero Bosses me ha pedido que pase la versión a través de una propiedad de formulario HTML (si hay un patrón mejor para esto, me encantaría escucharlo).

Una solución que estoy explorando ahora es desalojar a la entidad de la sesión después de que su versión se haya configurado utilizando hibernateTemplate.evict (simpleEntity) antes de que se realice la actualización. Espero que esto funcione, pero no parece eficiente.

Me gustaría pedirle a Hibernate que verifique la propiedad de la versión en la propia instancia, en lugar de hacerlo solo desde el caché de la sesión.

¡Gracias por adelantado por las respuestas!

- LES

Respuestas a la pregunta(1)

Su respuesta a la pregunta