Мой подход к этому будет следующим:
Создание класса, который заменяет JPATransactionManager, делегируя все вызовы скрытому локальному экземпляру JPATransactionManager.Этот класс дополнительно может предоставить возможность регистрации наблюдателей.При настройке вашего Spring-Container используйте этот новый класс вместо JPATransactionManager, все начальные Transaction-Calls должны проходить через него.
В зависимости от решения Transaction-Object, если вы хотите быть уверенным, что вы перехватываете все начальные вызовы, вы можете также создать делегат для объекта-транзакции, возвращаемого TransactionManager, и вернуть этот делегат.вашим TransactionManager-Delegate.