spring - 事件监听器在 Hibernate 上不起作用?

标签 spring hibernate events 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;
    }
}

积分器:

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/

相关文章:

javascript - addEventListener 未使用其功能

java - JPA CRUD 存储库查询

JavaFX : Integrating Spring framework with JavaFX app(Incorrect configuration)

java - servlet 和 web 服务之间的区别

java - @Email 验证注释导致部署中出现 NullPointerException

java - 在 Play 框架中使用 ElementCollection 时出现 LazyInitializationException

java - hibernate 、惰性行为和多个 session

spring - 在 Spring 中何时使用 <ref bean> 以及何时使用 <ref local>?

javascript - 是否可以检测到您的 JavaScript 代码正在因事件而执行?

c# - 新的 COM 端口可用事件