gpt4 book ai didi

java - 使用 JPA 获取旧数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:37 25 4
gpt4 key购买 nike

我使用 JPA 获取旧数据,即使我禁用了缓存。我猜是因为资源被配置为 RESOURCE_LOCAL,但我不确定。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="AppPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.myentities.User</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/mydatabase"/>
<property name="javax.persistence.jdbc.password" value="*****"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="user1"/>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
</persistence>

我的代码正在获取有关用户的旧信息:

public List<User> findAll(App app) {       
getEntityManager().getTransaction().begin();
Query q = getEntityManager().createQuery("SELECT t1 FROM User t1 WHERE t1.app.idApp=:idApp");
q.setParameter("idApp", app.getIdApp());
getEntityManager().flush();
getEntityManager().getTransaction().commit();
List resultList = q.getResultList();
return resultList;
}

我的实体:

@Entity
@Table(name = "user")
@Cache (
type=CacheType.NONE
)
public class User implements Serializable {

// some attributtes

}

有人知道发生了什么事吗?

更新 1

beginflushcommit 方法只是无奈之举!我知道不需要。

我忘了说一些重要的:我做的测试是添加用户记录直接在数据库控制台然后尝试通过我的webapp查看它,这是不显示新用户。也就是我说的“老数据”,它只显示“老用户”。

我已经尝试将它放在 persistence.xml 上,结果没有发现任何差异:

<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>

其他东西也是……

最佳答案

已经发布了一些建议,例如确保共享缓存关闭,以及管理反向引用以使缓存保持一致。这些是针对可能发生的特定情况,但您没有提供足够的信息来说明实际情况。

另一个具体但根据您的 getEntityManager() 用法看起来可能的情况是,如果您在不清除 EntityManager 实例的情况下重用它。 EntityManager 持有对所有托管实体的引用,因为 EM 需要在后续查询和查找调用中返回相同的实例以维护身份。

如果这还没有完成,将需要清除 EntityManager 或在某些点获得一个新的以释放内存和托管实体。

关于java - 使用 JPA 获取旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933617/

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