Eth*_*han 2 events spring hibernate listener
我已经实现了一个事件侦听器,用于审计我的实体的操作。例如,我为 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;
}
}
Run Code Online (Sandbox Code Playgroud)
积分器:
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
}
}
Run Code Online (Sandbox Code Playgroud)
文件 com.dacasals.raspertwo.interceptors.HibernateInterceptor:
com.dacasals.raspertwo.interceptors.HibernateInterceptor
Run Code Online (Sandbox Code Playgroud)
提前致谢。
编辑: 我在写作时犯了一个错误。我使用的是 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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以在插入、更新或删除任何实体时进行监听。我希望这个解决方案也适用于其他开发人员。
| 归档时间: |
|
| 查看次数: |
3359 次 |
| 最近记录: |