【问题标题】:Is there a stateless version of the JPA EntityManager?是否有 JPA EntityManager 的无状态版本?
【发布时间】:2015-01-21 23:31:54
【问题描述】:

Hibernate 有一个Stateless Version of its Session:JPA EntityManager 是否存在类似的东西? IE。不使用一级缓存的EntityManager?

【问题讨论】:

    标签: java jpa entitymanager stateless


    【解决方案1】:

    从 JPA 的角度来看:

    • javax.persistence.EntityManager 代表一级缓存(持久性上下文,事务性缓存)
    • javax.persistence.EntityManagerFactory 代表二级缓存(共享缓存)

    给定的持久性提供程序可能会实现额外的缓存层。此外,JDBC Driver API 可以被视为用于存储列/表和缓存连接/语句的低级缓存。然而,它对 JPA 是透明的。

    javax.persistence.EntityManagerorg.hibernate.StatelessSession 都提供类似的 API。

    你不能用 EntityManager 禁用一级缓存,因为这两件事是等价的。但是,您可以:

    • 使用createQuerycreateNamedQuerycreateNativeQuery 跳过一级缓存进行查询和批量更新/删除(不会更新持久性上下文以反映它们的结果)。此类查询应在其自己的事务中执行,从而使任何缓存的实体(如果有)无效。也应使用事务范围的实体管理器(意味着无状态)。
    • 通过在 persistence.xml 中设置 <shared-cache-mode>NONE</shared-cache-mode> 或在属性中设置 javax.persistence.sharedCache.mode 来禁用二级缓存

    【讨论】:

      【解决方案2】:

      不是 JPA API 或规范的一部分。个别实现可能允许禁用 L1 缓存。我用过的 DataNucleus JPA 确实允许这样做

      【讨论】:

        【解决方案3】:

        从接口的角度来看,RDBMS 通常尊重ACID constraintsstateless 选项会非常具体。我想这就是 Hibernate 提出这个特性而不是规范的原因。

        要禁用缓存,您有特定于实现的配置(here 是 EclipseLink 的文档)。实体级别的@Cacheable 注解(JPA 2.0)是标准的。

        但如果您想执行批量操作,这将无法胜任。无论如何,这种行为将是特定于实现的。

        【讨论】:

        • FWIW 您提到的注释是针对 L2 缓存而不是 L1
        猜你喜欢
        • 2022-10-21
        • 2012-01-27
        • 2011-06-26
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 2012-09-08
        • 2018-03-21
        • 2020-02-27
        相关资源
        最近更新 更多