禁用JPA中的缓存(eclipselink)

我想使用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);

一==二是正确的,而我希望它是错误的。

我尝试将以下每个/所有内容添加到我的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更新此数据,则需要获取Entity上的悲观锁,以便基础数据无法在DB中更改。

您还需要禁用查询缓存,并且您的缓存选项只是从播放中删除对象缓存,而不是查询缓存,这就是为什么您未获得新结果的原因:

在您的代码中:

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

或在persistence.xml中:

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

以上是 禁用JPA中的缓存(eclipselink) 的全部内容, 来源链接: utcz.com/qa/428597.html

回到顶部