java - JPA 实体不刷新(为每个事务使用新的 EntityManger)

标签 java jakarta-ee jpa persistence

我在 JPA 将旧数据保留在缓存中时遇到问题,并尝试了我能找到的解决方案,但它不断弹出!

无论如何,为了提高效率,我最初重复使用了一个实体管理器实例。当我第一次遇到所描述的问题时,我更改了代码,以便为每个事务创建一个新的实体管理器:

/** This method is called every time a transaction is made. */

public static EntityManager createFreshEntityManager() {
    try {
        return Persistence.createEntityManagerFactory(puName)
                          .createEntityManager();         
    } 
    catch (Exception e) {
        logStuff(e); 
        return null;
    }
}

但是,这并不能解决问题。

当我使用 JDBC 截断表并重置主键时,我经常注意到某些新创建的对象具有旧的变量值。我的一个怀疑是重置主键可能是罪魁祸首,但话又说回来,我已经为每个事务有了一个新的实体管理器,所以这根本不重要。

我非常有信心这不是我的代码的问题,因为数据库实体永远不会存储在函数范围之外的应用程序中,并且在需要时总是直接从数据库查询。

我还读过有关使用 EntityManager.clear() 的内容,但我不想做那么残酷的事情,因为它可能会弄乱多线程程序。

我曾想过使用 JPA 而不是 JDBC 来执行 TRUNCATE,方法是一次获取所有对象,然后手动将它们一一删除,但这效率很低......但话又说回来,它不会成为瓶颈。不确定这是否会有所作为。不过,使用 JDBC 来完成此操作。

最佳答案

我认为没有任何理由为每个事务创建一个新的 EntityManager。

您应该能够注入(inject)您的 EntityManager使用@PersistenceContext

它可能看起来像这样:

@Stateless
class SomeSessionBean implements SomeSessionBeanLocal {

    @PersistenceContext(unitName = "somePuName")
    private EntityManager em;

    public Customer findCustomerById(Long someId) {
        return em.find(Customer.class, someId);
    }
}

使用注释进行依赖注入(inject)是 EJB 3 最伟大的事情之一!

<小时/>

问题的可能根源:

如果您在 JavaEE Web 应用程序运行时修改数据库中的值,则 EJB 不太可能立即检测到这些更改。您的持久层可能正在使用缓存。

您可能希望在“外部”更改数据库后重新启动 Web 应用程序。

关于java - JPA 实体不刷新(为每个事务使用新的 EntityManger),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145660/

相关文章:

java - TestNG XML 文件无法调用/创建 XSSFWorkbook

java - 我在哪里可以找到 Eclipse 中 J2EE 应用程序的类路径

Java-ee编程;与 2 个表的 JPA 混淆

java - 具有 DayOfWeek 列表的 JPA 实体

java - 如何将 @Query 保留在属性文件中并在 JPA 中访问这些查询

java - 从java应用程序读取远程控制信号

java - JAXB 解码返回 null

java - 嵌入式 if 语句的替代方案?

java - 如何在Liferay 6.06中更新更改数据库密码?

java - Hibernate - 简单查询延迟获取