java - Hibernate 如何处理 NativeSQL 调用的缓存?

标签 java hibernate caching jpa

我需要运行 NativeQuery 插入命令,而不使用我的 Hibernate 实体。但我担心这将如何影响可能完成的任何缓存(L1/L2)。从我在博客等中读到的内容来看,Hibernate 在遇到任何 NativeQuery 调用时会自动刷新所有缓存。

这是真的吗?知道我正在使用 native sql 调用操作哪些表,我是否能够禁用 Hibernate 的自动刷新并具体控制要刷新的内容和要维护的内容?这可以通过注释来完成,还是必须通过调用 EntityManagerFactory.getCache().evict() 来完成?

例如:

entityManager.createNativeQuery(
    "INSERT INTO JOIN_TABLE (CONTRACT_ID, ATTACHMENT_ID ) VALUES( ?, ? )"
    .setParameter(1, 13)
    .setParameter(2, 25) 
    .executeUpdate();

默认情况下,无论我是否请求,hibernate 都会刷新我的缓存。

2014-06-20 15:00:56,964 [http-bio-8880-exec-3] [127.0.0.1-5385277c1ecbbf5a] INFO  org.hibernate.engine.internal.StatisticalLoggingSessionEventListener - Session Metrics {
    70000 nanoseconds spent acquiring 1 JDBC connections;
    0 nanoseconds spent releasing 0 JDBC connections;
    2731000 nanoseconds spent preparing 21 JDBC statements;
    11467000 nanoseconds spent executing 21 JDBC statements;
    0 nanoseconds spent executing 0 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    28387000 nanoseconds spent executing 2 flushes (flushing a total of 18 entities and 17 collections);
    674000 nanoseconds spent executing 2 partial-flushes (flushing a total of 2 entities and 2 collections)
}

最佳答案

您可以通过Query.setFlushMode控制每个查询对象的刷新模式类型。

“持久性提供程序负责确保对持久性上下文中所有实体的状态进行的所有更新(可能会影响查询结果)对于查询处理来说是可见的。持久性提供程序实现可以通过刷新来实现这一点将这些实体存入数据库或通过其他方式。”

看看FlushModeType

关于java - Hibernate 如何处理 NativeSQL 调用的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333695/

相关文章:

java - 如何解决boxlayout中的错位问题?

java - MultipartFile 在 RestTemplate 中失败,错误请求 400 无正文

java - JLabel:异步加载 HTML 图像

hibernate - 如果您将域(模型)名称存储在字符串中,如何在grails中获得搜索结果

django - 为 django 项目安装 memcached

java - 使用 Hibernate 的二级缓存时的默认缓存时间是多少

使用 4 维数组的 Java 程序

java - 非法访问 : this web application instance has been stopped already

java - Hibernate架构迁移设置命名策略

caching - memcached 是否有不同的设计以更好地处理更大的负载?多线程是否使其更适合更大的值?