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