java - 不同实体管理器之间共享 JPA 实体

标签 java jpa eclipselink

  • 根据 JPA 2.0 规范,是否允许在两个不同的实体管理器之间共享实体,例如通过以下方式:

    A entityA = em1.find(entityA.class,1L);
    B entityB = new entityB();
    b.setA(entityA); //entityB refers to entityA via @ManyToOne reference, cascade=CascadeType.PERSIST is enabled
    em2.persist(entityB);
    em2.flush();
    
  • 如果在第一行和第二行之间插入行 em1.detach(entityA); ,答案会改变吗? (或者换句话说:不同实体管理器之间是否允许共享分离实体)

最佳答案

  • 不可以,单个实体不允许由多个EntityManager管理
  • 是的,如果您有一个分离实体,则可以将其由另一个EntityManager管理,例如使用合并()

但是,在您的情况下,EntityManager 应该抛出异常,因为不允许将 persist() (在您的情况下,通过级联)应用于分离的实体。您应该删除级联选项或使用 merge() 而不是 persist()

如果您删除级联,我认为即使没有 detach() 也可以运行此代码,因为在这种情况下 entityA 不会由 em2

关于java - 不同实体管理器之间共享 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11398527/

相关文章:

java - JAVA中调用将字符串写入Excel工作表的方法时出现线程 "main"java.lang.NullPointerException错误

java - 无法理解声明

java - 从 Hibernate 中的插入中排除自动生成的标识列

hibernate - Spring 中与 Hibernate 的 SQL 连接异常

jpa - 仅在某些实体关系中禁用附加条件

java - 如果我关闭ObjectOuputStream,那么就不需要关闭FileOutputStream?

java - "No Persistence Unit Found"错误

java - 在Eclipse链接JPA中移至Java 8时间后derby数据库中的错误

java - EclipseLink JPA `@PreUpdate` 调用不持久

java - 如何在 Java 中将文件路径列表转换为雇佣树