gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:41:45 27 4
gpt4 key购买 nike

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com