Spring Boot 2.1.2,Hibernate 5:注册 Hibernate 事件侦听器 (Insert/Update/Delete)
Spring Boot 2.1.2, Hibernate 5: Register Hibernate Event Listeners (Insert/Update/Delete)
当我在之前的 Spring 应用程序中使用 Hibernate 4 时,以下内容足以注册 DB Insert/Update/Delete 事件的所有拦截。有一个简单的配置 class 和实际的拦截器实现。
配置class
@Component
public class HibernateEntityEventListenerConfig {
@Autowired
private SessionFactory sessionFactory;
@Autowired
private HibernateEntityEventListener entityEventListener;
@PostConstruct
public void registerListeners() {
final EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener((PreInsertEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener((PreUpdateEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener((PreDeleteEventListener) entityEventListener);
}
}
拦截器class
@Component
public class HibernateEntityEventListener implements PreInsertEventListener,
PreUpdateEventListener,
PreDeleteEventListener {
@Override
public boolean onPreInsert(PreInsertEvent event) {
//...
}
@Override
public boolean onPreUpdate(PreUpdateEvent event) {
//...
}
@Override
public boolean onPreDelete(PreUpdateEvent event) {
//...
}
但是,当我将此代码移植到使用 Hibernate 5 的 Spring Boot 2.1.2 应用程序时,我开始收到以下有关未找到 SessionFactory 的启动错误:
Field sessionFactory in util.HibernateEntityEventListenerConfig required
a bean of type 'org.hibernate.SessionFactory' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.hibernate.SessionFactory' in your configuration.
我四处搜索,只发现了一些我不信任或不理解的更复杂和混乱的代码,
现在这太复杂了,我只需要一种简单的方法来连接这个拦截器。放入拦截器并克服此 SessionFactory 错误的正确方法是什么?
我在 Bozho's blog 上找到了解决方案,代码可以与以前基本相同,但我不能再自动装配 SessionFactory
:我必须改为自动装配 EntityManagerFactory
,然后 "unwrap" 变成 SessinFactoryImpl sf = emf.unwrap(..)
。这是唯一的变化。
最新代码:
配置:
@Component
public class HibernateEntityEventListenerConfig {
@PersistenceUnit
private EntityManagerFactory emf; // NOTE Can't autowire SessionFactory.
@Autowired
private HibernateEntityEventListener entityEventListener;
@PostConstruct
public void registerListeners() {
// NOTE the emf.unwrap() to get the SessionFactoryImpl
SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class);
EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener((PreInsertEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener((PreUpdateEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener((PreDeleteEventListener) entityEventListener);
}
}
当我在之前的 Spring 应用程序中使用 Hibernate 4 时,以下内容足以注册 DB Insert/Update/Delete 事件的所有拦截。有一个简单的配置 class 和实际的拦截器实现。
配置class
@Component
public class HibernateEntityEventListenerConfig {
@Autowired
private SessionFactory sessionFactory;
@Autowired
private HibernateEntityEventListener entityEventListener;
@PostConstruct
public void registerListeners() {
final EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener((PreInsertEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener((PreUpdateEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener((PreDeleteEventListener) entityEventListener);
}
}
拦截器class
@Component
public class HibernateEntityEventListener implements PreInsertEventListener,
PreUpdateEventListener,
PreDeleteEventListener {
@Override
public boolean onPreInsert(PreInsertEvent event) {
//...
}
@Override
public boolean onPreUpdate(PreUpdateEvent event) {
//...
}
@Override
public boolean onPreDelete(PreUpdateEvent event) {
//...
}
但是,当我将此代码移植到使用 Hibernate 5 的 Spring Boot 2.1.2 应用程序时,我开始收到以下有关未找到 SessionFactory 的启动错误:
Field sessionFactory in util.HibernateEntityEventListenerConfig required
a bean of type 'org.hibernate.SessionFactory' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.hibernate.SessionFactory' in your configuration.
我四处搜索,只发现了一些我不信任或不理解的更复杂和混乱的代码,
现在这太复杂了,我只需要一种简单的方法来连接这个拦截器。放入拦截器并克服此 SessionFactory 错误的正确方法是什么?
我在 Bozho's blog 上找到了解决方案,代码可以与以前基本相同,但我不能再自动装配 SessionFactory
:我必须改为自动装配 EntityManagerFactory
,然后 "unwrap" 变成 SessinFactoryImpl sf = emf.unwrap(..)
。这是唯一的变化。
最新代码: 配置:
@Component
public class HibernateEntityEventListenerConfig {
@PersistenceUnit
private EntityManagerFactory emf; // NOTE Can't autowire SessionFactory.
@Autowired
private HibernateEntityEventListener entityEventListener;
@PostConstruct
public void registerListeners() {
// NOTE the emf.unwrap() to get the SessionFactoryImpl
SessionFactoryImpl sessionFactory = emf.unwrap(SessionFactoryImpl.class);
EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory)
.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener((PreInsertEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_UPDATE).appendListener((PreUpdateEventListener) entityEventListener);
registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener((PreDeleteEventListener) entityEventListener);
}
}