当我在先前的Spring应用程序中使用Hibernate 4时,以下内容足以注册所有对DB Insert / Update / Delete事件的拦截。有一个简单的Configuration类和实际的Interceptor实现。
配置类
@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);
}
}
拦截器类
@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.
我在Google上四处搜寻,但发现了一些我不信任或无法理解的复杂代码, https://stackoverflow.com/a/48471227/1005607
现在这太复杂了,我只需要一种简单的方法来连接此拦截器。插入拦截器并克服此SessionFactory错误的正确方法是什么?
答案 0 :(得分:1)
我在Bozho's blog上找到了解决方案,代码可以与以前保持大多数相同,但是我无法再自动连接const stripe = Stripe('pk_test_123');
:我必须自动连接SessionFactory
,然后将其“解包”为EntityManagerFactory
。那是唯一的变化。
最新代码: 配置:
SessinFactoryImpl sf = emf.unwrap(..)