禁用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