在本文档http://docs.oracle.com/javaee/5/tutorial/doc/bnbqw.html中,它说
托管实体实例具有持久标识 与持久化上下文关联.Dached实体实例具有 持久识别并且目前不与a关联 持久化背景。
所以我试图理解"与持久化语境相关的意思"?
答案 0 :(得分:3)
持久性上下文是负责将任何附加实体的状态与数据库状态同步的代码。 EntityManager类用于与持久性上下文交互。查询通过EntityManager(与持久性上下文交互)执行,并使实体状态与数据库内容保持同步。当实体与持久化上下文分离时(例如,通过调用EntityManager上的detach方法),实体的状态不再与数据库保持同步。
答案 1 :(得分:3)
您可以将 持久性上下文 视为能够存储 实体 的容器。使用 实体管理器 管理并与数据库同步。下图描绘了JPA类和接口之间的依赖关系:
可以通过执行以下命令来实现将实体与持久性上下文关联的过程:
EntityManager.persist
方法对新创建的实体EntityManager.merge
方法EntityManager.find
方法EntityManager.createNativeQuery
,EntityManager.createNamedQuery
和EntityManager.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.detach
或EntityManager.remove
方法;它们之间的区别在于分离的实体保留在底层数据库中,因为删除的实体不是EntityManager.commit
,EntityManager.rollback
,EntityManager.clear
,EntityManager.close
影响持久化背景的方法...
em.detach(emp);
isManaged = em.contains(emp); //false, detached, id=1
isFound = Objects.equals(emp, em.find(Employee.class, 1)); //false
虽然分离的实体仍然分配了持久标识,但它不再与持久化上下文相关联,因此与数据库同步。因此,对分离实体的任何更改都不会被持久化和提交,除非它被合并到持久化上下文中。在这种情况下,可能该实体已被另一方覆盖,因此变得陈旧,因此需要清除/重新分配实体的合并ID。