2010-11-16 10 views
5

J'ai été surpris d'apprendre récemment que le comportement de mise en veille prolongée par défaut consiste à mettre à jour tous les champs d'un objet si une seule modification est effectuée et que la fusion est appelée.Mise à jour dynamique avec JPA

dynamique de mise à jour est le domaine qui vous permet de configurer une autre approche de la mise à jour juste le champ a été modifié ...

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

J'utilise JPA avec mise en veille prolongée et j'ai essayé d'ajouter le suivant

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

à ma classe (auparavant il n'avait l'annotation JPA)

Quoi qu'il en soit, j'ai suivi de la sql et malheureusement, il n'a pas changé et je vois toujours tous les champs mis à jour.

Ceci est mon java qui met à jour l'objet ...

@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); 
} 

et la méthode de mise à jour effectue les opérations suivantes:

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

Toute aide serait grandement appréciée.

+1

Vous rendez-vous compte que l'appel à la mise à jour est complètement inutile? Hibernate conserve automatiquement les modifications apportées aux entités attachées à la fin de la transaction. –

+0

Hey, avez-vous déjà résolu cela?J'ai le même problème –

Répondre

0

Quelques questions pour vous aider:

  • Comment fonctionne votre méthode getUser()?
  • N'utilisez-vous pas d'objets détachés?
  • L'enregistrement associé est-il réellement chargé à partir de la base de données?

Les objets détachés ne sont pas liés à une version originale, donc l'origine du mot détaché. Cela permet à hiberner de faire n'importe quelle comparaison, ce qui l'oblige à effectuer une mise à niveau complète.

Comme je l'ai vu sur Springsource Forum, il ne fonctionne que lorsque l'option est réglée sur select-before-updatetrue qui semble tout à fait logique que Hibernate doit maintenant ce qui est réellement changé. L'option select-before-update force à lire l'original.

Si votre application lit le User complètement de la base de données et ne fonctionne pas avec des objets détachés alors je ne peux pas vous aider avec plus d'idées ...

0

De la documentation mise en veille prolongée:

Be Assurez-vous d'importer @ javax.persistence.Entity pour marquer une classe en tant qu'entité. C'est une erreur courante d'importer @ org.hibernate.annotations.Entity par accident.

+0

On dirait que l'affiche avait les deux annotations, donc je ne pense pas que l'extrait des docs soit pertinent. – sdouglass

0

Vous réattachez un objet détaché via l'appel à la fusion(). Dans ce cas, vous devez activer selectBeforeUpdate. C'est dans les javadocs.