2010-02-09 13 views
0

J'ai implémenté un DescriptorEventAdapter pour JPA (eclipselink). Il effectue des opérations d'horodatage simples. La méthode preUpdate est appelée, mais elle est appelée trop souvent. Il est appelé et met à jour l'horodatage, même sur les opérations de recherche/sélection.JPA PreUpdate implémenté à l'aide de DescriptorEventAdapter appelé après find/select

Le problème que je rencontre semble se produire dans une autre structure JPA également, http://markmail.org/message/nank44rgp4xi2ita#query:JPA%20preupdate%20being%20called%20after%20find+page:1+mid:xssqpg7hm4mesfl5+state:results.

J'ai essayé de:

  • vérifier la ChangeSet sur la DescriptorEvent, ce qui est toujours chèque nul
  • le code sur le DescriptorEvent, ce qui est toujours 6

Je n'a pas été en mesure de trouver un autre drapeau ou attribut qui dit "cet objet a vraiment été mis à jour".

Comment obtenir preUpdate pour agir uniquement lorsqu'un enregistrement a été réellement mis à jour et non simplement sélectionné?

+0

Vous avez également essayé d'utiliser UnitOfWork via event.getSession(). Cela provoque un StackOverflowError lorsque le serveur démarre. – Freiheit

Répondre

0

Voici la solution que j'ai trouvée après avoir lu cette question; J'ai également constaté que le ChangeSet sur le DescriptorEvent semble toujours être nul.

J'ai cependant remarquer que l'événement a des méthodes pour obtenir le avant et après les objets:

Object oldObject = event.getOriginalObject(); 
Object newObject = event.getSource(); 

qui vous permet de faire une comparaison manuelle des champs. En utilisant la réflexion, vous pouvez écrire un peu de code qui pourrait comparer tous les champs d'une classe.

+0

C'est une solution intéressante. La réflexion ne devrait pas être nécessaire si les deux classes implémentent equals() ou si les classes d'entités étendent une interface commune qui définit une méthode comme 'boolean shouldUpdateTimestamp()' – Freiheit