事件侦听器不适用于 Hibernate?

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。

Eth*_*han 6

我让我的听众在不使用我以前找到的方法的情况下工作。我没有使用服务定义文件,而是创建了一个新类,在其中注册我实现的事件侦听器,如下所示:

@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)

现在,我可以在插入、更新或删除任何实体时进行监听。我希望这个解决方案也适用于其他开发人员。