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

时间:2014-06-20 18:41:23

标签: java hibernate caching jpa

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

这是真的吗?知道我正在使用本机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)
}

1 个答案:

答案 0 :(得分:0)

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

“持久性提供程序负责确保对持久性上下文中可能影响查询结果的所有实体的状态的所有更新对于查询的处理是可见的。持久性提供程序实现可以通过刷新来实现那些实体到数据库或通过其他方式。“

查看FlushModeType