Hibernate JPA 实体侦听器 @Pre 和 @Post 未按预期工作
Hibernate JPA Entity listener @Pre and @Post don't work as expected
我正在构建一个实时应用程序并尝试使用实体侦听器来使我的状态保持最新。基本思想是,每当业务逻辑的某个区域发生变化时,我都会重新加载受影响的实体并协调这些变化。这是一个 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 将 insert/remove 星放入 DB。我原以为 post-persist 会因为添加的项目而多显示一项,而 post-remove 会比 pre-remove 少显示一项。不是这样的,post-persist 和 post-remove 都显示不正确的项目数,所以 pre-persist 和 post-persist 一样,pre-remove 是与 post-删除相同。我确定它与 Hibernate-s 缓存有关,但我正在使用事务并且一切都通过 EntityManager
所以我挠头。
A callback method must not invoke EntityManager
or Query
methods!
在实践中,如果你这样做,行为是不确定的,因此你在你的例子中观察到的结果。
我正在构建一个实时应用程序并尝试使用实体侦听器来使我的状态保持最新。基本思想是,每当业务逻辑的某个区域发生变化时,我都会重新加载受影响的实体并协调这些变化。这是一个 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 将 insert/remove 星放入 DB。我原以为 post-persist 会因为添加的项目而多显示一项,而 post-remove 会比 pre-remove 少显示一项。不是这样的,post-persist 和 post-remove 都显示不正确的项目数,所以 pre-persist 和 post-persist 一样,pre-remove 是与 post-删除相同。我确定它与 Hibernate-s 缓存有关,但我正在使用事务并且一切都通过 EntityManager
所以我挠头。
A callback method must not invoke
EntityManager
orQuery
methods!
在实践中,如果你这样做,行为是不确定的,因此你在你的例子中观察到的结果。