Mise en veille prolongée Interceptor: entité intercepté lorsqu'un élément de collecte mis à jour

StackOverflow https://stackoverflow.com/questions/1568192

  •  21-09-2019
  •  | 
  •  

Question

Je dois savoir comment puis-je mettre en veille prolongée (...) pour parvenir à la question suivante:

I ai bidirectionnel (composition) un-à-plusieurs (a.bs est un ensemble objet et B.Un est un objet A). Quand je charge « un » de DB et mettre à jour l'un de ses « bs » J'ai besoin Hiernate intercepter une entité quand saveOrUpdate A.

Code:

public class A {
   Set<B> bs = new HashSet<B>();
   // ... other fields and setters/getters
}
public class B {
   A a = null;
   // ... other fields and setters/getters
}

Exemple d'utilisation:

A a = load("idA"); // load A from DB
B b = s.getBById("idB"); // get a B element of A
b.setName("blablabla"); // update a field of B
saveOrUpdate(a); // persist A entity with its Bs (including modified B)

Le changement est effectué parce que le modèle (mini) a été annotée correctement.

Le problème est que mon intercepteur ne détecte que le changement dans l'entité B, mais pas A. Je dois détecter un changement parce que je dois mettre à jour les informations d'audit.

Autre point de vue est le suivant: je dois obtenir une entité via B et le mettre à jour. En fait, je peux obtenir A partir de B, mais le changement ne persistent pas ...

Simplifier la question: Je dois modifier une entité (fixer une date) lorsque mon intercepteur entité B intercepte. Il worksfine en onSave mais pas dans onFlushDirty. Pourquoi?

Ceci est: Lorsque B est mis à jour, est intercepté (onFlushDirty). Le corps de la méthode onFlushDirty, entre autres, faites ceci:

b.getA().setLastModifyDate(new Date());

Alors, en ce moment, une entité, qui est attaché à la session, devrait devient sale, d'où elle devrait soulever une action d'interception ... Je veux dire, la méthode onFlushDirty doit être appelé à nouveau, son temps pour une entité. Ai-je tort? Mais, en tout cas, A.lastModifyDate devrait être mis à jour ... et cela ne se produit pas !!!

Après que je montre le comportement réel de ma demande:

  1. Je crée un objet A
  2. créer un objet B et je l'associe à A
  3. A = Je persiste> A.lastModifyDate est la date correcte ( OK )

  4. créer un objet A

  5. créer un objet B et je l'associe à A
  6. A = Je persiste> A.lastModifyDate est la date correcte ( OK )
  7. Je charge l'objet B, mettre à jour et je persévère B -> A.lastModifyDate est la date correcte ( OK )

  8. créer un objet A

  9. créer un objet B et je l'associe à A
  10. A = Je persiste> A.lastModifyDate est la date correcte ( OK )
  11. je charge un objet, mettre à jour son objet B et je persiste A -> A.lastModifyDate n'est pas la date correcte ( KO )

  12. créer un objet A

  13. créer un objet B et je l'associe à A
  14. A = Je persiste> A.lastModifyDate est la date correcte ( OK )
  15. je charge un objet, mettre à jour le champ de tout A et aussi son objet B et je persiste A -> A.lastModifyDate n'est pas la date correcte ( KO )

  16. Je crée un objet et un je persiste il.

  17. je charge un objet, je lui associer un nouvel objet B et A = je persiste> A.lastModifyDate est la date correcte ( OK )

  18. Je crée un objet et un je persiste il.

  19. je charge un objet, mettre à jour tout le champ A, je lui associer un nouvel objet B et je persiste A => A.lastModifyDate est la date correcte ( OK )

Toute idée?

Merci!

Était-ce utile?

La solution

Vous devez utiliser onCollectionUpdate pour résoudre le problème

scroll top