2010-11-16 24 views
5

Me sorprendió descubrir recientemente que el comportamiento de hibernación predeterminado es actualizar todos los campos de un objeto si se realiza un único cambio y se llama a la combinación.Actualización dinámica con JPA

dinámico de actualización es el campo que le permite configurar un enfoque alternativo de simplemente actualizar el campo modificado ...

http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

estoy usando JPA con Hibernate y traté de añadir el siguiente

@javax.persistence.Entity 
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true) 

a mi clase (anteriormente sólo tenían la anotación JPA)

de todos modos, he estado monitorizando el sql y desafortunadamente no lo cambió y todavía estoy viendo todos los campos actualizados.

Esta es mi java que actualiza el objeto ...

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)  
public void setAccountStatusForUser(String username, AccountStatus act){ 
    User u = this.getUser(username); 
    u.setAccountStatus(act); 
    this.update(u); 
} 

y el método de actualización realiza lo siguiente:

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
    public Object update(Object o) { 
     Object a = this.entityManager.merge(o); 
     this.entityManager.flush(); 
     return a; 
} 

Cualquier ayuda sería apreciada grandemente.

+1

¿Te das cuenta de que la llamada a la actualización es completamente innecesaria? Hibernate automáticamente persiste los cambios realizados en las entidades adjuntas al final de la transacción. –

+0

Oye, ¿alguna vez resolvió esto?Tengo el mismo problema –

Respuesta

0

Algunas preguntas para ayudarle a:

  • ¿Cómo funciona su getUser() método?
  • ¿No utiliza objetos desprendidos?
  • ¿El registro asociado está completamente cargado desde la base de datos?

objetos aislados, que no están vinculados con cualquier versión original, de ahí el origen de la palabra unifamiliar. Esto ayuda a hibernar al hacer cualquier comparación, lo que lo obliga a realizar una actualización completa.

Como vi en Springsource Forum, funciona solo cuando la opción select-before-update está configurada en , lo que parece bastante lógico ya que Hibernate tiene ahora que cambiar. La opción select-before-update lo obliga a leer el original.

Si la aplicación lee el User completamente de la base de datos y no está trabajando con objetos separados entonces yo no te puedo ayudar con más ideas ...

0

De la documentación de hibernación:

Sea asegúrese de importar @javax.persistence.Entity para marcar una clase como una entidad. Es un error común importar @ org.hibernate.annotations.Entity por accidente.

+0

Parece que el póster tenía ambas anotaciones, por lo que no creo que ese fragmento de documentos sea relevante. – sdouglass

0

Está volviendo a conectar un objeto separado a través de la llamada a la fusión(). En ese caso, debe activar selectBeforeUpdate. Esto está en los javadocs.

Cuestiones relacionadas