分离的v / s瞬态实体

时间:2018-10-24 06:56:56

标签: java hibernate

我真的对分离实体和瞬态实体感到困惑。根据定义,临时实体不与会话关联,并且没有DB记录。分离的实体与会话关联,并具有数据库记录。所以对于前。如果我有一个人表。人员表中有一条ID为2的记录。因此,如果执行以下操作:

Person p = new Person();
p.setId(2);

由于实体p具有数据库记录但未与会话关联,是否将其视为已分离?还是会被认为是短暂的?如果是瞬态的,那么以下代码是否是创建分离实体的正确示例?

Person p = session.load(Person.class,2);
session.evict(p); // does this make the entity detached?

我对于上述哪种方法创建独立实体感到非常困惑,因此任何见解都将受到高度赞赏!谢谢!

3 个答案:

答案 0 :(得分:0)

如果我们像下面这样执行session.evict(obj);

Person p = session.load(Person.class,2);
session.evict(p);

然后将POJO对象逐出或从持久状态恢复为分离状态。这样,POJO对象的该状态为分离状态。之后,GC(垃圾收集器)可以轻松清洁该物体。所以

session.evict(p); // does this make the entity detached? Yes it is in detached state.

答案 1 :(得分:0)

是正确的:

  

先对托管实体对象进行序列化然后反序列化,   反序列化的实体对象(但不是原始序列化的对象)是   构造为独立实体对象,因为与   任何EntityManager。

和瞬态实体字段:

  

临时实体字段是不参与的字段   持久性及其值永远不会存储在数据库中(类似   到Java中不参与序列化的瞬态字段。

现在您可以总结问题的答案了。

答案 2 :(得分:0)

当实体由 EntityManager 维护时,实体被称为分离的,然后通过调用 evict() 方法将其分离。

瞬态可以有两种类型。

  1. 当一个字段被@Transient注解时,它不会参与transient(可以与Serialization的@Transient关联)
  2. 当您准备一个新实体但尚未提交到数据库时。当您调用 persist() - JPA 或 save()-Hibernate 时,它​​会将其状态从瞬态更改为持久状态。