Hibernate JPA实体监听器@Pre和@Post不能按预期工作

时间:2016-09-03 23:07:08

标签: java hibernate jpa entitylisteners

我正在构建一个实时应用程序并尝试使用实体侦听器来保持我的状态是最新的。基本思想是,只要业务逻辑区域发生变化,我就会重新加载受影响的实体并协调更改。这是一个MWE:

@PrePersist
public void PrePersist() {
    LoggerFactory.logger(App.class).info(" >>> PrePersist count: " + getStars().size());
}
@PostPersist
public void PostPersist() {
    LoggerFactory.logger(App.class).info(" >>> PostPersist count: " + getStars().size());
}
@PreRemove
public void PreRemove() {
    LoggerFactory.logger(App.class).info(" >>> PreRemove count: " + getStars().size());
}

@PostRemove
public void PostRemove() {
    LoggerFactory.logger(App.class).info(" >>> PostRemove count: " + getStars().size());
}
private List<Star> getStars() {
    EntityManager em = HibernateUtilJpa.getEntityManager();
    List<Star> l = new ArrayList<Star>();
    try {
        em.getTransaction().begin();
        l = em.createQuery("from Star", Star.class).getResultList();
        em.getTransaction().commit();
    } catch (Exception e) {
        em.getTransaction().rollback();
    } finally {
        em.close();
    }
    return l;
}

我正在使用单独的API将数据插入/移除到数据库中。我期待post-persist会因为添加的项目而显示更多项目,并且post-remove将比预删除少一个。情况并非如此,后保留和后删除都显示不正确的项目数,因此预先保留与后保持相同,并且预删除与删除后相同。我确定它与Hibernate的缓存有关,但我正在使用事务,所有内容都通过EntityManager,所以我在摸不着头脑。

1 个答案:

答案 0 :(得分:2)

来自documentation

  

回调方法不得调用EntityManagerQuery方法!

在实践中,如果你这样做的行为是未定义的,那么你在例子中观察到的结果。