我已经实现了一个事件监听器来审核我的实体上的操作。例如,我为 PreInsertEventListener 制作了一个名为 HibernatePreInsert 的事件监听器。另外,通过阅读 stackoverflow 上的此处,我配置了一个名为 HibernateIntegrator 的集成器。由于我使用的是 Hibernate 4 和 spring 4,因此我在 META-INF/services 下创建了一个名为 com.dacasals.raspertwo.interceptors.HibernateInterceptor 的文件,并在其中添加了集成器类,正如网上和此处推荐的那样。但是当我运行我的应用程序并插入一个新元素时,没有任何反应,甚至没有显示我的 HibernatePrePersist 的消息。这是我第一次尝试 Hibernate EventListeners,我不知道可能出了什么问题。
这是我的问题涉及的类的示例,还有文件结构:
听者:
public class HibernatePreInsert implements PreInsertEventListener{
private static final long serialVersionUID = 1L;
static final Logger logger = LoggerFactory.getLogger(HibernatePreInsert.class);
@Override
public boolean onPreInsert(PreInsertEvent event) {
if(event.getEntity() instanceof Person){
//display a message to know if this works or not
logger.info("It works");
}
return false;
}
}
积分器:
public class HibernateIntegrator implements Integrator{
public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry){
final EventListenerRegistry registry = serviceRegistry.getService(EventListenerRegistry.class);
HibernatePreInsert listener = new HibernatePreInsert();
registry.prependListeners(EventType.PRE_INSERT, listener);
}
@Override
public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
// TODO Auto-generated method stub
}
@Override
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
// TODO Auto-generated method stub
}
}
文件 com.dacasals.raspertwo.interceptors.HibernateInterceptor:
com.dacasals.raspertwo.interceptors.HibernateInterceptor
提前致谢。
编辑: 我在写作时犯了一个错误。我使用的是 Hibernate 5,而不是 4。
最佳答案
我让我的听众开始工作,而没有使用我之前找到的方法。我没有使用服务定义文件,而是创建了一个新类,在其中注册我实现的事件监听器,如下所示:
@Component
public class EscuchadorGeneral {
@PersistenceUnit
private EntityManagerFactory emf;
@Inject
private InsertEvent insert;
@Inject
private UpdateEvent update;
@Inject
private DeleteEvent delete;
@PostConstruct
protected void init(){
SessionFactoryImpl sF = emf.unwrap(SessionFactoryImpl.class);
EventListenerRegistry registry = sF.getServiceRegistry().getService(EventListenerRegistry.class);
registry.getEventListenerGroup(EventType.POST_INSERT).appendListener(insert);
registry.getEventListenerGroup(EventType.POST_UPDATE).appendListener(update);
registry.getEventListenerGroup(EventType.PRE_DELETE).appendListener(delete);
}
}
现在我可以监听我的任何实体被插入、更新或删除的情况。我希望这个解决方案也适用于其他开发人员。
关于spring - 事件监听器在 Hibernate 上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42302291/