gpt4 book ai didi

mysql - hibernate JPA+mysql : can not disable caching in createNativeQuery

转载 作者:可可西里 更新时间:2023-11-01 07:33:14 24 4
gpt4 key购买 nike

我将 Hibernate/JPA 与 mySQL 一起使用,并且由于遗留原因,我曾一度创建 NativeQuery。该应用程序与使用相同数据库的不同服务器一起工作,因此它根本不应该进行缓存,但始终显示最新结果。我通过在数据库编辑器中手动更改值来模拟其他服务器,但更改后它总是给出旧结果。

据我所知,我应该禁用任何二级缓存(不是很重要,因为我不使用任何 ORM 对象),clear() 任何一级缓存,并禁用 mysql 查询缓存(已在数据库级别完成) ).我在哪里失败,或者我忘记了什么?这让我发疯。

init(): servlet 的开始

    entityFactory = Persistence.createEntityManagerFactory("persistence-id");

getEntityManager():每个请求的开始

    destroyEntityManager(); // just in case
entityFactory.getCache().evictAll();
entityManager = entityFactory.createEntityManager();
entityManager.setProperty("javax.persistence.cache.storeMode",
CacheStoreMode.BYPASS);
entityManager.clear(); // just in case

destroyEntityManager():每次请求结束

    if (entityManager != null) {
if (entityManager.getTransaction().isActive()) {
entityManager.flush();
entityManager.getTransaction().commit();
}
entityManager.clear();
if (entityManager.isOpen()) {
entityManager.close();
}
entityManager = null;
}

destroy(): servlet 结束

    destroyEntityManager();
if (entityFactory != null) {
entityFactory.close();
}

持久性.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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_1_0.xsd" version="1.0">
<persistence-unit name="WallMountBackOffice-PU">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>...</class>
<class>...</class>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost/ourschema" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="" />
<property name="hibernate.connection.pool_size" value="10" />
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.connection.release_mode" value="on_close" />
<property name="dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.cache.use_second_level_cache"
value="false" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="javax.persistence.sharedCache.mode" value="NONE" />
<property name="org.hibernate.cacheable" value="false" />
</properties>
</persistence-unit>

执行“选择...”的代码:

    ...
Query jpaQuery = entityManager.createQuery(query);
entityManager.getTransaction().begin();
jpaQuery.executeUpdate();
entityManager.getTransaction().commit();

最佳答案

第一行有个错误,一定是“BYPASS”而不是“REFRESH”,如下:

query.setHint("javax.persistence.cache.retrieveMode", "BYPASS");

并且建议使用 JPA 枚举而不是字符串文字,因此它将是:

query.setHint(QueryHints.CACHE_RETRIEVE_MODE, CacheRetrieveMode.BYPASS);
query.setHint(QueryHints.CACHE_STORE_MODE, CacheStoreMode.REFRESH);

关于mysql - hibernate JPA+mysql : can not disable caching in createNativeQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13122861/

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