Bonjour à tous,
J'ai créé une classe utilitaire pour supprimer les entrées dans une relation one to many qui ne figurent plus dans le Set. Par exemple pour la classe Prof et Eleve, en supprimant un eleve de la liste, on est obligé d'aller effacer l'eleve de la base manuellement si on veut faire un merge() sur le prof. Le probleme es bien connu et TopLink a une solution: http://forums.oracle.com/forums/thre...sageID=1707487 qui est spécifique (donc plus dans le cadre de JPA). Dans un forum Hibernate ils disent qu'on doit supprimer les elements du PersistentSet (le Set original qui a servi à la lecture de la base) pour pouvoir avoir un effacement automatique. La théorie c'est bien, mais perso j'y suis pas parvenu.
Ceci dit, pour etre 100% JPA, on peut imaginer une classe qui intercepte les merge() et fait le travail qu'il faut sur les dépendances. Cette classe je l'ai ecrit, j'ai juste un problème à rejoindre la managed transaction ejb3 pour effacer dans le meme scope que la methode. Eh oui!, il faut que ca se passe dans la même transaction que le merge sinon ca n'a pas de sens.
Quelqu'un saurait comment faire pour acceder à la transaction dans un @PreUpdate ?. Aujourd'hui je lance ma classe directement dans mon code de session, le probleme c'est que c'est "workaround" JPA et n'a rien à voir avec la logique de l'appli. Peut être un intercepteur Spring serait la solution, mais mettre du spring rien que pour ca me parait tout de même un peu crado.
J'ai posté une query au forum d'hibernate: http://forum.hibernate.org/viewtopic...376486#2376486
Si vous avez une idée, faites moi savoir svp,
Zied Hamdi
www.into-i.fr
Partager