2009-12-03 30 views
15
@Entity 
public class Person { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    private int salary; 

    @Version 
    private long version; 

    // ...getters and setters 
} 
  1. ¿Se requiere para crear setter/getter para version?
  2. Al persistir esta entidad con Hibernate, no es necesario que establezca este valor manualmente, ¿verdad?
  3. ¿Qué más necesito configurar para utilizar la comprobación de concurrencia optimista con Spring's hibernateTemplate.saveOrUpdate? ¿Son compatibles todas las bases de datos?
  4. ¿Cómo probar la unidad de esta entidad? En mi base de datos, todos mis registros que muestran el campo de versión tienen el valor de 0
  5. ¿Llamarán hibernateTemplate.saveOrUpdate para incrementar el valor de la versión cada vez?

Respuesta

12

yo diría: se requiere

  1. set/versión de obtener, como se podría asignar la versión de sí mismo a veces (al volver a crear una nueva instancia de datos antiguos)
  2. No es necesario si lees la instancia de la base de datos. (Al crearlo en tu código con nuevo, sería una historia diferente).
  3. No veo nada más. Nunca tuve un problema con una base de datos.
  4. Prueba de unidad no voy a la base de datos en mi opinión, por lo que las pruebas que involucran la base de datos se llaman pruebas de integración. No debe tener demasiados, ya que son lentos, y realmente no prueban su código, pero más los códigos de Hibernación/Controlador/Base de datos ... Debe confiar en ellos, o simplemente probarlos una vez, pero no para todas tus entidades
    Para ver valores de versión de más de 0, leer/modificar/actualizar su entidad en una transacción, la versión aumenta en uno. Salga de la transacción, hágalo de nuevo, el valor aumenta ...
  5. La versión aumentará cada vez que se modifique la fila de la base de datos.
+0

@KLE solo en caso de que el usuario 2 llame a hibernatetemplate.saveorupdate al mismo tiempo, no hay necesidad de realizar comprobaciones adicionales cuando llame a la llamada hibernatetemplate.saveorupdate? cualquier excepción arroja? – cometta

+1

@cometta El punto es no guardar o no, pero de dónde provienen los datos. En una transacción, ** si lee una entidad de la base de datos **, su información de versión está actualizada. Cuando lo guardas, se lo cuida automáticamente. Si pasa algún día para obtener los datos de otra fuente (por ejemplo, la publicación de un formulario), y vuelve a crear la entidad, entonces usted debe cuidar la versión usted mismo. – KLE

+0

Una explicación bastante buena está aquí: http://en.wikibooks.org/wiki/Java_Persistence/Locking – Zilvinas