Mise en veille prolongée Interceptor: entité intercepté lorsqu'un élément de collecte mis à jour
-
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:
- Je crée un objet A
- créer un objet B et je l'associe à A
-
A = Je persiste> A.lastModifyDate est la date correcte ( OK )
-
créer un objet A
- créer un objet B et je l'associe à A
- A = Je persiste> A.lastModifyDate est la date correcte ( OK )
-
Je charge l'objet B, mettre à jour et je persévère B -> A.lastModifyDate est la date correcte ( OK )
-
créer un objet A
- créer un objet B et je l'associe à A
- A = Je persiste> A.lastModifyDate est la date correcte ( OK )
-
je charge un objet, mettre à jour son objet B et je persiste A -> A.lastModifyDate n'est pas la date correcte ( KO )
-
créer un objet A
- créer un objet B et je l'associe à A
- A = Je persiste> A.lastModifyDate est la date correcte ( OK )
-
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 )
-
Je crée un objet et un je persiste il.
-
je charge un objet, je lui associer un nouvel objet B et A = je persiste> A.lastModifyDate est la date correcte ( OK )
-
Je crée un objet et un je persiste il.
- 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!
La solution
Vous devez utiliser onCollectionUpdate pour résoudre le problème
Autres conseils
Ok, donc si (comme vous l'avez dit dans votre commentaire) que vous utilisez une réelle
si vous voulez le faire fonctionner à l'aide onFlushDirty, vous devez manuellement rincer la session après saveOrUpdate (a); ce qui garantira une mise à jour dans un objet persistant entrerons dans db commettre; si votre en mode automatique de chasse, engager déclenchera une autre flush qui trouvera l'entité mère aussi sale. d'autre l'objet coutume de se sauver becoz l'intercepteur ne sauvegarde l'entité modifiée en cours. J'ai une affaire similaire où je dois mettre à jour les champs d'audit de l'entité mère d'une collection enfant. la différence est im mon service est que la liste sauve de la collecte des enfants hors de l'entité mère.