Hibernate有一个Stateless Version of its Session:JPA EntityManager是否存在类似的东西?即一个不使用第一级缓存的EntityManager?
答案 0 :(得分:5)
从JPA的角度来看:
javax.persistence.EntityManager
代表第一级缓存(持久性上下文,事务缓存)javax.persistence.EntityManagerFactory
代表二级缓存(共享缓存)给定的持久性提供程序可以实现其他缓存层。此外,JDBC驱动程序API可以被视为低级缓存,用于存储列/表和缓存连接/语句。然而,它对JPA来说是透明的。
javax.persistence.EntityManager和org.hibernate.StatelessSession都提供类似的API。
你不能用EntityManager禁用第一级缓存,因为这两件事是等价的。但是你可以:
createQuery
,createNamedQuery
,createNativeQuery
跳过一级缓存进行查询和批量更新/删除(不更新持久性上下文以反映其结果)。此类查询应在其自己的事务中执行,从而使任何缓存的实体(如果有)无效。也应该使用事务范围的实体管理器(意味着无状态)。<shared-cache-mode>NONE</shared-cache-mode>
或在属性中设置javax.persistence.sharedCache.mode
来禁用二级缓存答案 1 :(得分:2)
不属于JPA API或规范。各个实现可以允许禁用L1高速缓存。 DataNucleus JPA,我使用过的,确实允许这个
答案 2 :(得分:0)
从接口的角度来看,RDBMS通常尊重ACID constraints,无状态选项非常具体。我想这就是为什么Hibernate提出这个功能而不是规范的原因。
要禁用缓存,您需要特定于实现的配置(here是EclipseLink的文档)。实体级别的@Cacheable注释(JPA 2.0)是标准的。
但是如果你想进行批量操作,这将无法完成任务。无论如何,这种行为将是特定于实现的。