2010-02-09 2 views
0

Я реализовал дескрипторEventAdapter для JPA (eclipselink). Он выполняет простые операции с меткой времени. Вызывается метод preUpdate, однако он вызывается слишком часто. Он вызывается и обновляет метку времени, даже при поиске/выборе операций.JPA PreUpdate реализован с использованием дескриптораEventAdapter, вызванного после find/select

Проблема, с которой я столкнулся, как представляется, встречается в другой структуре JPA также, http://markmail.org/message/nank44rgp4xi2ita#query:JPA%20preupdate%20being%20called%20after%20find+page:1+mid:xssqpg7hm4mesfl5+state:results.

Я попытался:

  • проверки ревизии, на DescriptorEvent, это всегда нулевая проверка
  • код на DescriptorEvent, это всегда 6

У меня есть не удалось найти какой-либо другой флаг или атрибут, который говорит, что «этот объект действительно обновлен».

Как заставить preUpdate действовать только тогда, когда запись действительно была обновлена, а не просто выбрана?

+0

Вы также попробовали gettng UnitOfWork через event.getSession(). Это вызывает StackOverflowError при запуске сервера. – Freiheit

ответ

2

http://wiki.eclipse.org/Configuring_a_Descriptor_(ELUG)#Table_115-27

The preUpdate называется все время, по-видимому. aboutToUpdate - лучший метод вызова для запуска, когда необходимо выполнить обновление.

+0

Существует также preUpdateWithChanges, который вызывается только тогда, когда требуется обновление. – James

0

Вот решение, которое я придумал после прочтения этого вопроса; Я также обнаружил, что ChangeSet на дескриптореEvent всегда кажется нулевым.

Я тем не менее заметил, что событие имеет методы, прежде чем получить, что и после того, как объекты:

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

который бы позволяет сделать вручную сравнение полей. Используя отражение, вы можете написать немного кода, который мог бы сравнить все поля в любом классе.

+0

Это интересное решение. Отражение не должно быть необходимым, если два класса реализуют equals() или если классы сущностей расширяют некоторый общий интерфейс, который определяет метод, подобный 'boolean shouldUpdateTimestamp()' – Freiheit

Смежные вопросы