jpa 刷新的实体未反映在数据库中

Posted

技术标签:

【中文标题】jpa 刷新的实体未反映在数据库中【英文标题】:jpa flushed entity not reflected in DB 【发布时间】:2017-02-06 08:20:19 【问题描述】:

此代码工作正常并已部署。但是经过一段时间或几天后,刷新的数据没有反映在数据库中

 protected boolean update(Object entity) 
    EntityManager entityManager = null;
    try 
        entityManager = this.createEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        try 
            tx.begin();
            entityManager.merge(entity);
            entityManager.flush();
            tx.commit();
            return true;
         catch (Exception e) 
            logger.error("Exception thrown in update(): " + e.getMessage());
            tx.rollback();
            return false;
        
     catch (Exception e1) 
        logger.error("Exception thrown in create(): " + e1.getMessage(), e1);        
        return false;
     finally 
        if (entityManager != null && entityManager.isOpen()) 
            this.closeEntityManager(entityManager);
        
    

这是我的父 dao 更新方法。

提前发送。

【问题讨论】:

flush 调用毫无意义,因为提交会刷新。在日志中查找您的 JPA 提供程序,了解提交(或刷新)时发生的情况。此外,您应该在 try 中添加 finally,以便您可以在 finally 中回滚(而不是在 catch 中) 更新事务没有错误但在DB中没有反映 这不是我问的。你 finally 应该在内部尝试,所以你总是回滚并抛出错误。您的 JPA 提供者的 LOG 会告诉您发生了什么(调用 SQL 等)。又名调试 @NeilStockton 我在 finally 块中实现了 tx.rollback。那总是无法回滚。该问题仅在相关实体更新上出现,例如,如果我们更新一个效果很好的用户实体,但关系列表部门新添加的部门未反映在数据库中。我陷入了这个问题。 【参考方案1】:

为什么每次更新都创建一个新的 entityManager?

根据文档:

如果在实体管理器加入活动事务时调用此方法,则持久性上下文将保持受管理状态,直到事务完成。

https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#close--

【讨论】:

那一行文档适用于事务为 JTA 时,即 UserTransaction。 OP 正在使用 RESOURCE_LOCAL 事务(因为它调用了 EntityTransaction.commit)。为所有更新创建一个新的 EM 本身不是问题,因为它很便宜。 能否提供更多关于依赖数据库的信息? ***.com/questions/8105618/…

以上是关于jpa 刷新的实体未反映在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

JPA 查询未在列表中返回更新的结果

JPA 实体未保存在数据库中

后端数据库异步更改时如何刷新JPA实体?

在 JPA/Hibernate 中正确使用 flush()

Angular 的 Kendo 中未刷新网格数据

MYSQL Workbench 未填充 Spring Boot JPA 实体的表数据