Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA使用Spring Roo进行假设更新_Spring_Jpa_Post Update - Fatal编程技术网

JPA使用Spring Roo进行假设更新

JPA使用Spring Roo进行假设更新,spring,jpa,post-update,Spring,Jpa,Post Update,我正在使用SpringRoo1.2.3进行一个项目,我需要在更新实体库存时创建另一个实体X的新记录。我会这样做(类似于数据库中的触发器更新) 当应用程序退出时,此方法抛出错误,并且不保存新元素X 但如果我通过以下方式更改最后一种方法: @PostPersist @PostUpdate private void triggerStock() { Calendar fechaActual = Calendar.getInstance(); Long cantidad =

我正在使用SpringRoo1.2.3进行一个项目,我需要在更新实体库存时创建另一个实体X的新记录。我会这样做(类似于数据库中的触发器更新)

当应用程序退出时,此方法抛出错误,并且不保存新元素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才能工作


多亏了…

在提交期间调用了PostUpdate,持久化单元已经确定了更改的内容和需要写入的内容,因此更改内容为时已晚(然后需要重新计算需要写入的内容)


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

此外,我还发现了以下信息一般来说,可移植应用程序的生命周期方法不应调用EntityManager或查询操作,不应访问其他实体实例,也不应修改同一持久性上下文中的关系。生命周期回调方法可能会修改调用它的实体的非关系状态
@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();         
}