什么是hibernate中的分离,持久和临时对象?
什么是hibernate中的分离,持久和临时对象? 请用一个例子来解释。
一个与Session
没有关联的持久类的new
实例在数据库中没有表示,并且没有标识符值被Hibernate认为是瞬态的:
Person person = new Person(); person.setName("Foobar"); // person is in a transient state
持久化实例在数据库中有一个表示forms,一个标识符值并且与一个Session
相关联。 您可以通过将会话与Session
关联来使暂时实例持久化 :
Long id = (Long) session.save(person); // person is now in a persistent state
现在,如果我们close
Hibernate Session
,持久化实例将成为一个分离的实例:它不再附加到一个Session
(但是仍然可以修改并重新附加到一个新的Session
)。
所有这一切都清楚地解释了整个第10章。使用 Hibernate文档的对象 ,我只是在上面解释。 绝对必须阅读。
hibernate中的对象具有以下状态:
瞬态 – 使用新运算符实例化的对象称为瞬态对象。
如果一个对象刚刚使用new运算符进行了实例化,则该对象是暂时的,并且与Hibernate Session没有关联。 它在数据库中没有持久表示,并且没有分配标识符值。 如果应用程序不再拥有引用,则垃圾收集器将销毁瞬态实例。
持久性 – 具有与其关联的数据库标识的对象称为持久对象。
持久实例在数据库中有一个表示和一个标识符值。 它可能只是被保存或加载; 然而,它是根据定义在会议的范围内。 Hibernate将检测对持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。
分离 – 分离的实例是一个持久的对象,但其Session已经closures。
分离的实例可以在稍后的时间点重新附加到新的会话中,使其重新持续。 此function为需要用户思考时间的长时间运行的工作单元启用编程模型。 我们称之为应用程序事务,即从用户的angular度来看是一个工作单元。
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
除了正确的答案已经确定持久性,瞬态,分离只是在hibernate状态的对象。
更准确地说,这三个状态实际上显示了hibernate对象的变化和会话生命周期状态
让我在垃圾收集器的angular度来解释也。
有3个hibernate的对象状态(或者)hibernate的对象范围 –
- 瞬态状态
- 持久状态
- 分离状态
用代码示例来理解更好 –
让我们考虑一个POJO类作为学生对象 – >
Student student = new Student();
现在,这个学生对象处于暂态 。
当我们将这个POJO对象挂接到hibernate session->时
session.save(student);
现在这个POJO对象处于持久状态 。
(垃圾收集器的观点 – GC不能清除处于持久状态的任何对象,所以我们可以说持久化状态就像POJO对象的临时存储 )
如果我们执行 – >
session.beginTransaction.commit();
那么POJO对象处于永久或数据库存储状态
(垃圾收集器的观点 – GC不能清除这个对象,因为这个POJO对象现在超出了JVM的范围,并且存储在一个数据库的表格表中。我们可以说这个数据库存储状态就像POJO的永久存储对象 )
如果我们执行 – >
session.evict(student);
那么POJO对象就会被驱逐或从持久状态移回到分离状态 。这种POJO对象的这种状态是分离状态 。
(垃圾收集器的angular度来看,GC可以轻松地从JVM中清除分离状态的POJO对象)
考虑以下实体:
@Entity public class City { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; // other fields and methods. }
从hibernate5.2文档 (我也包括removed
状态):
短暂的
该实体刚刚被实例化,并且与持久性上下文没有关联。 它在数据库中没有持久表示,通常没有标识符值被分配(除非使用了分配的生成器)。
City city = new City();
pipe理,或持久
该实体具有关联的标识符并且与持久性上下文相关联。 它可能在物理上也可能不存在于数据库中。
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate // and reflected to the database when the persistence context is flushed. session.save(city);
超脱
该实体具有关联的标识符,但不再与持久化上下文相关联(通常是因为持久化上下文已closures或实例已从上下文中逐出)
// city is in a detached state, Hibernate is no longer aware of the entity session.evict(city)
我有
去除
该实体具有关联的标识符并且与持久化上下文相关联,但是其被安排从数据库中移除。
session.remove(city);
注意: Hibernate API提供了一些方法来在实体状态之间切换,我认为值得探讨一下Hibernate Session类 。