Запуск метода обратного вызова из другого метода обратного вызова

У меня есть обратный вызов PrePersist, который создает объекты Assignment. Мне нужно инициировать обратные вызовы, чтобы сообщить мне, когда эти объекты назначения вставляются в базу данных. Обратные вызовы PostPersist для назначений не запускаются таким образом. Единственный сработавший обратный вызов — это PostAdd, который мне не помогает. Как мне это сделать? Спасибо.


person Tuan    schedule 22.07.2015    source источник


Ответы (1)


Эмпирические правила для постоянных объектных событий:

  • обратные вызовы для объектов предназначены для логики, связанной с самим объектом (например, установка временной метки, сброс непостоянного свойства и т. д.)
  • прослушиватели (еще одна форма обработчиков событий Cayenne) предназначены для задач аудита и рабочих процессов, которые должны выполняться при фиксации объекта.

У вас другая ситуация, когда вы собираете «совокупный» объект, состоящий из других постоянных объектов. Поэтому я предлагаю полностью убрать эту логику из обратных вызовов и включить в фабричный класс, который знает, как создавать и соединять объекты вместе.

person andrus_a    schedule 23.07.2015
comment
Андрус, я устанавливаю объект «Сотрудник» в объект «Назначение», объект «Сотрудник» — это тот, для которого был запущен обратный вызов Prepersist. Я попытался установить их в localContext, чтобы иметь дело с ними в двух разных контекстах. При фиксации изменений локального контекста он по-прежнему будет вызывать обратный вызов сотрудника и переходит в StackOverflowError из-за бесконечной рекурсии. Как вы делаете commitChanges(), не вызывая обратный вызов из объекта Employee? - person Tuan; 24.07.2015
comment
В ситуации, когда вы собираете агрегатный объект, состоящий из других постоянных объектов, я предлагаю полностью убрать его из обратных вызовов и включить в какой-нибудь фабричный класс. Теперь, когда вы объяснили, что вы пытаетесь сделать, этот ответ имеет гораздо больше смысла, чем то, что я опубликовал изначально. Так что я исправлю ответ - person andrus_a; 27.07.2015