我需要运行 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控制每个查询对象的刷新模式类型。
“持久性提供程序负责确保对持久性上下文中所有实体的状态进行的所有更新(可能会影响查询结果)对于查询处理来说是可见的。持久性提供程序实现可以通过刷新来实现这一点将这些实体存入数据库或通过其他方式。”
关于java - Hibernate 如何处理 NativeSQL 调用的缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333695/