2009-10-28 5 views
3

J'ai une classe AbstractEntity comme superclasse pour tous mes ENTITES qui définit une colonne de verrouillage optimiste comme ceci:Gestion OptimisticLocking et @OneToMany (mappedBy = ...)?

@Version 
private long lockVersion; 

Maintenant, je reçois souvent OptimisticLockingExceptions sur les entités, qui ne sont modifiés dans une des relations mappedBy semblables à ce qui suit :

@OneToMany(mappedBy = Property.PROPERTY_DESCRIPTOR, cascade = { CascadeType.REMOVE }) 
private Set<Property> properties = new HashSet<Property>(); 

Est-il possible d'exclure ces collections Hibernate verrouillage optimiste? L'entité n'est pas du tout changée dans la base de données ... seules les autres la référencent.

Répondre

2

Vous pouvez exclure une propriété particulière (et/ou d'une collection) d'augmenter le numéro de version si elle est sale en excluant explicitement via @OptimisticLock annotation:

@OptimisticLock(excluded=true) 
@OneToMany(mappedBy = Property.PROPERTY_DESCRIPTOR, cascade = { CascadeType.REMOVE }) 
private Set<Property> properties = new HashSet<Property>(); 

Soyez conscient que c'est une extension Hibernate à la norme JPA.

+0

Cela semble prometteur ... Je vais vérifier si cela résout mes problèmes. –

+0

J'ai ajouté cette annotation à toutes les collections mappedBy qui ne fusionnent ni ne fusionnent ni ne persistent. Une autre solution consiste à distinguer entity.getCollection(). Add (...) pour les entités non gérées et em.refresh (entité) pour les entités gérées. Ceci évite également le problème de verrouillage. –

0

Je pense que la réponse acceptée à cette question devrait vous aider: link

Je havn't essayé moi-même si, mais il pourrait être possible de détecter les changements ne nécessitant pas la mise à jour de la version et non incrémenter la version.

+0

Hmm pourrait être ... mais j'espérais une sorte d'annotation ou d'hibernation pour résoudre ce problème ... nous verrons. –

+0

D'accord, c'est un peu hackish ... – Tomas

Questions connexes