我已经实现了审计操作的事件监听器在我的实体。例如,我做了一个名为PreInsertEventListener HibernatePreInsert。此外,通过阅读这里的计算器我叫配置的HibernateIntegrator积分。由于我使用Hibernate 4和弹簧4,我创建在名为com.dacasals.raspertwo.interceptors.HibernateInterceptor META-INF /服务文件,并在那里我加积分类,建议在网上和这里。但是,当我运行我的应用程序,并插入一个新的元素,没有任何反应,不显示我的HibernatePrePersist连消息。这是我第一次尝试休眠事件侦听器,我不知道什么可能是错误的。
这里是和示例涉及我的问题类,也文件结构:
监听器:
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
提前致谢。
编辑:我犯了一个错误,而写。我使用休眠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);
}
}
现在,我可以听的时候我的任何实体的插入,更新或删除。我希望这个解决方案适用于其他开发商了。
因为所有你想要做的是操纵关联到该事件的实体,我会在这里提倡@PrePersist
的使用。
你可以欺骗Hibernate来仍火JPA集成回调,即使应用程序不使用任何JPA的功能,并继续使用原生SessionFactory
配置。
对于之前的5.2休眠,你需要确保你还包括匹配您的hibernate-entitymanager
依赖相同版本的上你的依赖的classpath相应版本hibernate-core
。为了保存Hibernate 5.2及以后,所有你需要包括是hibernate-core
,你显然已经在使用。
接下来是设置META-INF/services/org.hibernate.integrator.spi.Integrator
。
对于之前的4.2 Hibernate,您需要添加:
org.hibernate.ejb.event.JpaIntegrator
对Hibernate 4.3和5.x,您需要添加:
org.hibernate.jpa.event.spi.JpaIntegrator
您现在应该能够使用@PrePersist
回调甚至当你的配置不引导一个JPA EntityManager
。
然后,当您端口您的应用程序使用JPA具体而言,可以最终消除这种集成配置作为JPA内置EntityManager
将自动注册,并执行这些回调。
UPDATE
如果您决定要使用Hibernate EventListener
,我会确保这两种方法integrate
注册该侦听器。我想你已经实现了其中一人仍然对传统的合同,但我相信以后版本的Hibernate使用其他签名明确,你还没有实现。这可能是为什么你的听众不火。