Pas*_*ent 155
甲new其不与相关联的永久类的实例Session,有在数据库中并没有标识符值不表示被认为是瞬时的休眠:
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Run Code Online (Sandbox Code Playgroud)
甲持久实例具有在数据库中的表示,标识符值,并与一个相关联Session.您可以通过将瞬态实例与以下内容相关联来使其成为永久实例Session:
Long id = (Long) session.save(person);
// person is now in a persistent state
Run Code Online (Sandbox Code Playgroud)
现在,如果我们close是Hibernate Session,持久化实例将成为一个分离的实例:它不再附加到一个Session(但仍然可以修改并重新附加到新的实例Session).
所有这些都在整个第10章中得到了清楚的解释.使用 Hibernate文档的对象,我只是在上面解释.绝对是必读的.
小智 7
hibernate中的对象具有以下状态:
瞬态 - 使用new运算符实例化的对象称为瞬态对象.
如果对象刚刚使用new运算符进行实例化,并且它与Hibernate会话无关,则该对象是瞬态的.它在数据库中没有持久表示,并且没有分配标识符值.如果应用程序不再持有引用,则垃圾收集器将销毁瞬态实例.
持久性 - 具有与之关联的数据库标识的对象称为持久对象.
持久化实例在数据库中具有表示和标识符值.它可能刚刚被保存或加载; 但是,根据定义,它在会话的范围内.Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步.
已分离 - 已分离的实例是一个持久的对象,但其会话已关闭.
分离的实例可以在以后的某个时间点重新连接到新的Session,使其再次持久化.此功能为需要用户思考的长时间运行工作单元启用编程模型.我们称之为应用程序事务,即从用户的角度来看工作单元.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
让我也从垃圾收集器的角度解释一下。
有 3 种休眠的对象状态(或)休眠的对象范围 -
最好通过代码示例来理解-
让我们将 POJO 类视为 Student Object->
Student student = new Student();
Run Code Online (Sandbox Code Playgroud)
现在,这个学生对象处于瞬态。
当我们将此 POJO 对象附加到休眠会话时->
session.save(student);
Run Code Online (Sandbox Code Playgroud)
现在这个 POJO 对象处于持久状态。
(垃圾收集器的观点- GC 不能清除任何处于持久状态的对象。所以我们可以说持久状态就像POJO 对象的临时存储)
如果我们执行->
session.beginTransaction.commit();
Run Code Online (Sandbox Code Playgroud)
那么 POJO 对象处于永久或数据库存储状态
(垃圾收集器的观点——GC 无法清除这个对象,因为这个 POJO 对象现在不在 JVM 的范围内,存储在数据库内部的表单表中。所以我们可以说这个数据库存储状态就像POJO 的永久存储对象)
如果我们执行->
session.evict(student);
Run Code Online (Sandbox Code Playgroud)
然后POJO对象被驱逐或从持久状态移除回分离状态。所以POJO对象的这种状态是分离状态。
(垃圾收集器的观点——GC可以很容易地从JVM中清除掉处于分离状态的POJO对象)
| 归档时间: |
|
| 查看次数: |
81338 次 |
| 最近记录: |