"与持久性背景相关联是什么意思"?

时间:2014-10-14 22:35:55

标签: java jpa entitymanager

在本文档http://docs.oracle.com/javaee/5/tutorial/doc/bnbqw.html中,它说

  

托管实体实例具有持久标识   与持久化上下文关联.Dached实体实例具有   持久识别并且目前不与a关联   持久化背景。

所以我试图理解"与持久化语境相关的意思"?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您可以将 持久性上下文 视为能够存储 实体 的容器。使用 实体管理器 管理并与数据库同步。下图描绘了JPA类和接口之间的依赖关系:

Relationships between JPA classes and interfaces


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

  • EntityManager.persist方法对新创建的实体
  • 分离实体上的
  • EntityManager.merge方法
  • 具有给定实体类型及其主键的
  • EntityManager.find方法
  • 基于SQL / JPQL / CriteriaAPI的查询的
  • EntityManager.createNativeQueryEntityManager.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.detachEntityManager.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。