1

我在尝试测试注册为 JPA 实体生命周期观察者时遇到问题POST_COMMIT_INSERT

因为我的观察者是一个spring bean,所以我将它连接到实体管理器中,如下所示:

private void configureHibernateHooks(HistoricEventListener<?> listener) {
    SessionFactory sessionFactory = getSessionFactory();

    EventListenerRegistry registry = ((SessionFactoryImpl) sessionFactory).getServiceRegistry().getService(
            EventListenerRegistry.class);

    if (listener instanceof PostInsertEventListener)
    {
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener((PostInsertEventListener) listener);
    }
}

SessionFactory getSessionFactory() {
    Session session = (Session) entityManager.getDelegate();
    SessionFactory sessionFactory = session.getSessionFactory();
    return sessionFactory;
}

我的测试被注释为@Transactional. 因此,据我了解,每个测试都在它自己的事务中运行。这阻止了我的观察者方法被调用,因为在我的测试期间事务没有提交,所以POST_COMMIT_XXX永远不会观察到监听器。

我尝试注入EntityManager并手动提交事务,但这导致了异常。

测试这些的适当策略是什么?

4

1 回答 1

1

您可以在测试方法上使用 @Rollback(false) 注释来指示 spring 提交事务而不是回滚它。

甚至触发 entityManger.flush() 就足够了。我认为事件触发与事务的提交无关(名称可能具有误导性)。

于 2012-09-06T04:07:26.083 回答