Spring-Managed Hibernate Event Listeners
Hibernate offers event listeners as part of its SPI. You can hook your listeners to a number of events, including pre-insert, post-insert, pre-delete, flush, etc.
But sometimes in these listeners you want to use spring dependencies. I’ve written previously on how to do that, but hibernate has been upgraded and now there’s a better way (and the old way isn’t working in the latest versions because of missing classes).
This time it’s simpler. You just need a bean that looks like this:
@Component public class HibernateListenerConfigurer { @PersistenceUnit private EntityManagerFactory emf; @Inject private YourEventListener listener; @PostConstruct protected void init() { SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class); EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class); registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(listener); registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(listener); registry.getEventListenerGroup(EventType.POST_DELETE).appendListener(listener); } }
It is similar to this stackoverflow answer, which however won’t work because it also relies on deprecated calsses.
You can also inject a List<..>
of listeners (though they don’t share a common interface, you can define your own).
As pointed out in the SO answer, you can’t store new entities in the listener, though, so it’s no use injecting a DAO, for example. But it may come handy to process information that does not rely on the current session.
Reference: | Spring-Managed Hibernate Event Listeners from our JCG partner Bozhidar Bozhanov at the Bozho’s tech blog blog. |