有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java“与持久性上下文关联”是什么意思?

在这个文档中,它说

Managed entity instances have a persistent identity and are associated with a persistence context.Detached entity instances have a persistent identify and are not currently associated with a persistence context.

所以我试图理解“关联持久性上下文”是什么意思


共 (2) 个答案

  1. # 1 楼答案

    持久性上下文是负责将任何连接实体的状态与数据库状态同步的代码。EntityManager类用于与持久性上下文交互。查询通过EntityManager(与持久性上下文交互)执行,并使实体状态与数据库内容保持同步。当实体从持久性上下文分离时(例如,通过调用EntityManager上的detach方法),该实体的状态不再与数据库保持同步

  2. # 2 楼答案

    您可以将持久化上下文视为一个容器,该容器能够存储实体,这些实体可以通过使用实体管理器与数据库进行管理和同步。下图描述了JPA类和接口之间的依赖关系:

    Relationships between JPA classes and interfaces


    将实体与持久性上下文关联的过程可以通过执行:

    • ^新创建的实体上的{}方法
    • ^分离实体上的{}方法
    • ^具有给定实体类型及其主键的{}方法
    • ^使用基于SQL/JPQL/CriteriaAPI查询的{}、EntityManager.createNamedQueryEntityManager.createQuery方法

    对于事务范围的容器管理的持久性上下文,需要在事务范围内调用这些方法

    @Entity
    public class Employee {
        @Id
        private int id; //determines persistent identity
        public Employee(int id) { this.id = id; }
    }
    

    持久性标识允许通过其主键跨相同类型的所有实体定位实体,并在刷新或提交持久性上下文时(通过刷新/提交手动或自动)同步到数据库

    Employee emp = new Employee(1);
    
    em.persist(emp);
    boolean isManaged = em.contains(emp); //true, managed, id=1
    boolean isFound = Objects.equals(emp, em.find(Employee.class, 1)); //true
    

    持久化实体会使其成为受管理的实体(与持久化上下文关联)。这并不意味着实体与数据库同步


    将实体与持久性上下文解除关联的过程可以通过执行以下操作来实现:

    • ^托管实体上的{}或EntityManager.remove方法;它们之间的区别在于,分离的实体保留在基础数据库中,因为没有删除实体
    • EntityManager.commitEntityManager.rollbackEntityManager.clearEntityManager.close影响持久性上下文的方法
    • 序列化作为将其传递到另一层或通过远程接口发送的效果
    ...
    em.detach(emp);
    isManaged = em.contains(emp); //false, detached, id=1
    isFound = Objects.equals(emp, em.find(Employee.class, 1)); //false
    

    尽管分离的实体仍然分配了持久性标识,但它不再与持久性上下文关联,因此与数据库同步。因此,对分离实体的任何更改都不会被持久化和提交,除非将其合并到持久化上下文中。在这种情况下,实体可能已被另一方覆盖,因此变得过时,因此需要清除/重新分配被合并实体的id