gpt4 book ai didi

java - 在 JPA 中禁用缓存(eclipselink)

转载 作者:IT老高 更新时间:2023-10-28 20:40:56 25 4
gpt4 key购买 nike

我想使用 JPA (eclipselink) 从我的数据库中获取数据。数据库由许多其他来源更改,因此我想为我执行的每个查找返回数据库。我已经阅读了许多关于禁用缓存的帖子,但这似乎不起作用。有什么想法吗?

我正在尝试执行以下代码:

        EntityManagerFactory entityManagerFactory =  Persistence.createEntityManagerFactory("default");
EntityManager em = entityManagerFactory.createEntityManager();

MyLocation one = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);

MyLocation two = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);

System.out.println(one==two);

one==two 为真,而我希望它为假。

我已尝试将以下每个/所有内容添加到我的 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"/>

我也尝试将@Cache 注释添加到实体本身:

@Cache(
type=CacheType.NONE, // Cache nothing
expiry=0,
alwaysRefresh=true
)

我是不是误会了什么?

最佳答案

这种行为是正确的,否则如果你用不同的值改变对象一和对象二,你会在持久化它们时遇到问题。正在发生的是调用加载对象二更新了第一次调用中加载的实体。它们必须指向同一个对象,因为它们是同一个对象。这样可以保证脏数据不能被写入。

如果您在两次调用之间调用 em.clear(),实体 1 应该分离,您的检查将返回 false。但是没有必要这样做,eclipse链接实际上将您的数据更新到最新的我猜这是您想要的,因为它经常更改。

附带说明,如果您希望使用 JPA 更新此数据,您需要获取 pessimistic locks在实体上,以便数据库中的基础数据无法更改。

您将需要禁用查询缓存以及您的缓存选项只是从播放中删除对象缓存而不是查询缓存,这就是您没有得到新结果的原因:

在您的代码中:

em.createNamedQuery("MyLocation.findMyLoc").setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache).getResultList().get(0);

或者在persistence.xml中:

<property name="eclipselink.query-results-cache" value="false"/>

关于java - 在 JPA 中禁用缓存(eclipselink),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2809275/

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