Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有JPA EntityManager的无状态版本?_Java_Jpa_Entitymanager_Stateless - Fatal编程技术网

Java 是否有JPA EntityManager的无状态版本?

Java 是否有JPA EntityManager的无状态版本?,java,jpa,entitymanager,stateless,Java,Jpa,Entitymanager,Stateless,Hibernate有一个问题:JPA EntityManager是否存在类似的东西?即,不使用一级缓存的EntityManager?从JPA的角度来看: javax.persistence.EntityManager代表一级缓存(持久性上下文,事务性缓存) javax.persistence.EntityManagerFactory代表二级缓存(共享缓存) 给定的持久性提供程序可以实现额外的缓存层。此外,JDBC驱动程序API可以被视为用于存储列/表和缓存连接/语句的低级缓存。然而,它对JP

Hibernate有一个问题:JPA EntityManager是否存在类似的东西?即,不使用一级缓存的EntityManager?

从JPA的角度来看:

  • javax.persistence.EntityManager
    代表一级缓存(持久性上下文,事务性缓存)
  • javax.persistence.EntityManagerFactory
    代表二级缓存(共享缓存)
给定的持久性提供程序可以实现额外的缓存层。此外,JDBC驱动程序API可以被视为用于存储列/表和缓存连接/语句的低级缓存。然而,它对JPA是透明的

两者都提供类似的API

您不能使用EntityManager禁用一级缓存,因为这两种功能是等效的。但是,您可以:

  • 使用
    createQuery
    createNamedQuery
    createNativeQuery
    进行查询和批量更新/删除,跳过一级缓存(持久性上下文不会更新以反映其结果)。这样的查询应该在它们自己的事务中执行,从而使任何缓存的实体(如果有的话)无效。还应使用事务范围的实体管理器(表示无状态)
  • 通过在persistence.xml中设置
    NONE
    ,或在properties中设置
    javax.persistence.sharedCache.mode
    ,禁用二级缓存

不属于JPA API或规范的一部分。个别实现可能允许禁用一级缓存。我使用的DataNucleus JPA确实允许从接口的角度来看这一点,RDBMS通常尊重,无状态选项将非常具体。我想这就是为什么Hibernate提出这个特性而不是规范的原因

要禁用缓存,您有特定于实现的配置(是EclipseLink的文档)。实体级别的注释(JPA2.0)是标准的


但是,如果您想执行批量操作,这将不起作用。无论如何,这样的行为是特定于实现的。

FWIW您提到的注释是针对二级缓存而不是一级缓存的