14

He estado trabajando en un servicio web RESTful con datos de primavera. Hace unos días, un marco especial REST de jpa de datos de primavera was released.Usando @Version en el proyecto de datos de primavera

Ahora noté la capacidad de usar @Version con este marco. ¿Esta versión está generada por sí misma o necesita hacerlo manualmente?

¿Y es posible usar @Version por sí mismo? (Para que no tenga que cambiar nada a mis repositorios/dominios existentes, etc.)

¿Y necesito hacer alguna configuración adicional para usar @Version?

Respuesta

34

Ha pasado un tiempo desde que publiqué esta pregunta, pero lo he descubierto. Explicaré lo que hice para que pueda ser útil para otra persona.

La anotación @Version es una interfaz javax.persistence y no el marco jpa de datos de primavera como mencioné anteriormente.

Si desea hacer uso de @Version es necesario crear un campo de versión en el objeto de dominio, así:

@Version 
@Column(name = "VERSION") 
private long version; 

Si está usando Hibernate lo hará recogida automáticamente la anotación y se creará una fila de "versión" en su tabla (en mi caso MySql). Cada vez que se actualiza un registro, la hibernación incrementará el contador con 1.

Ahora, ¿por qué es esto algo que quieres? Bueno, la razón por la que tal vez quiera usar esto es porque disminuye la posibilidad de que sus clientes estén trabajando con stale data. Cada vez que un cliente obtiene información de usted, se proporciona una versión con los datos que solicitó. p.ej.

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "De regenboog", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Ahora, si un cliente desea cambiar algo de información acerca de este registro específico, envía la información nueva junto con el valor de la versión. En este caso, cambiemos el nombre de la escuela.

{      <-- School entity --> 
    "id": 1, 
    "version": 0,     
    "name": "Stackoverflow", 
    "street": "Plantaanstraat", 
    "number": "2", 
    "zipCode": "1234AS", 
    "city": "Amsterdam" 
} 

Hibernate viene con una consulta con su información y agrega una cláusula adicional 'where' para verificar la versión. update .... where id = 1 and version = 0. Ahora, si la fila se actualiza, significa que proporcionó la versión correcta y que nadie más ha cambiado esa información específica entre el momento en que solicitó la información, la cambió y la envió de regreso. Agradable ¿verdad?

¿Qué pasa si la fila no se actualiza? Significa que otra persona actualizó esa fila mientras tomaba un baño rápido después de que usted solicitó la información. ¡Significa que su versión está desactualizada! Lo que debe suceder ahora es realmente específico de caso de uso, así que no voy a entrar en detalles sobre eso :)

Espero que alguien pueda usar esta información!

Gracias a todos

+0

Eso tiene sentido. Definitivamente me ayudó. Gracias – kalz

1

Asegúrese de importar importación javax.persistence.Version

y no el muelle de uno.

+0

Ya agregué eso a mi respuesta: "La anotación @Version es una interfaz javax.persistence y no el marco de datos jpa de primavera como lo mencioné anteriormente". –

+1

Importante para el motivo de la nota.La anotación Spring @Version es para todo menos para JPA. Ver http://stackoverflow.com/a/31883006/328808. –

Cuestiones relacionadas