java Hibernate JPA实体侦听器@Pre和@Post未按预期工作

xriantvc  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(100)

我正在开发一个真实的应用程序,并尝试使用实体侦听器来保持我的状态最新。基本思想是,每当业务逻辑的某个区域发生变化时,我都会重新加载受影响的实体并协调这些变化。以下是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-persistent会因为添加的项而多显示一个项,post-remove会比pre-remove少一个项。事实并非如此,post-persistent和post-remove显示的项的数量都不正确,所以pre-persistent和post-persistent是一样的。pre-remove和post-remove是一样的,我确信这与Hibernate的缓存有关,但是我使用的是事务,所有的事情都要经过EntityManager,所以我很挠头。

toiithl6

toiithl61#

来自文档:
回调方法不能调用EntityManagerQuery方法!
在实践中,如果你这样做的行为是不确定的,因此你在例子中观察到的结果。

相关问题