Зафиксирую тут некоторые моменты дебага, которые проводил для Detach события, потому как нет ничего навернутого мной, просто открываю экран отчета из интерфейса.
Проблема с тем, что не срабатывает событие действительно связано с тем, что теряется объект синхронизации при обработке транзакции. А конкретно ContainerResourceSynchronization
с ContainerResourceHolder
.
Проблема начинается с
ContainerResourceHolder holder =
(ContainerResourceHolder) TransactionSynchronizationManager.getResource(RESOURCE_HOLDER_KEY);
if (holder == null) {
в PersistenceSupportImpl.getInstanceContainerResourceHolder()
. Иногда holder
не null (при начале транзакции) и уже синхронизирован с транзакцией (и в нем куча непонятных UnitOfWork). Соответственно новая синхронизация не регистрируется.
Судя по всему в какой-то момент для потока не происходит очистка ресурсов после транзакции и они остаются висеть, периодически попадая в обработку, если поток отдается пользователю.
Есть ощущение, что проблема с EntityChangedEvent растет отсюда же…