2

我正在一个项目中使用 Spring Roo 1.2.3,当实体 Stock 更新时,我需要创建另一个实体 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 才能工作?

谢谢...

4

1 回答 1

1

PostUpdate 在提交期间被调用,持久化单元已经确定了哪些内容发生了变化以及需要写入哪些内容,因此现在更改内容为时已晚(然后需要重新计算需要再次写入的内容)。

根据您使用的 JPA 提供程序,有一些方法可以强制从事件中写入某些内容,但您需要小心。

于 2013-05-30T13:36:30.870 回答