我在一个项目上使用Spring Roo 1.2.3,我需要在实体股票更新时创建另一个实体X的新记录。我会做这样的事情(类似于数据库中的触发器更新)。
@PostPersist
@PostUpdate
private void triggerStock() {
Calendar fechaActual = Calendar.getInstance();
Long cantidad = this.getCantidadStock() - this.getCantidadAnterior();
StockHistory history = new StockHistory();
history.setArticulo(this.getArticulo());
history.setFecha(fechaActual);
history.setCantidad(cantidad);
history.persist();
}
当应用程序退出此方法时会抛出错误,并且不会保存新元素X。
但如果我改变最后一个方法:
@PostPersist
@PostUpdate
private void triggerStock() {
Calendar fechaActual = Calendar.getInstance();
Long cantidad = this.getCantidadStock() - this.getCantidadAnterior();
StockHistory history = new StockHistory();
history.setArticulo(this.getArticulo());
history.setFecha(fechaActual);
history.setCantidad(cantidad);
EntityManagerFactory emf = entityManager().getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.setFlushMode(FlushModeType.COMMIT);
em.persist(history);
em.getTransaction().commit();
em.close();
}
这很好用,但我想理解为什么我需要一个新的EntityManager才能使用它?
...谢谢
答案 0 :(得分:1)
在提交期间调用PostUpdate,持久性单元已经确定了更改内容以及需要编写的内容,因此更改内容为时已晚(然后需要重新计算它需要再次编写的内容)。
根据您使用的JPA提供程序,有一些方法可以强制从事件中编写内容,但您需要小心。