• 瞬时状态(Transient)

  通过new创建对象后,对象并没有立刻持久化,它并未与数据库中的数据有任何关联,此时Java对象的状态为瞬时状态。

  Session对于瞬时状态的Java对象是一无所知的,当对象不再被其他对象引用时,它的所有数据也就丢失了,对象将会被Java虚拟机按照垃圾回收机制处理。

  • 持久状态(Persistent)

  当对象与Session关联,被Session管理时,它就处于持久状态。处于持久状态的对象拥有数据库标识(数据库中的主键值)。

  那么,对象是什么时候与Session发生关联的呢?有两种方法:

    第一种,通过Sesison的查询接口,或者get()方法,或者load()方法从数据库中加载对象的时候,加载的对象是与数据库表中的一条记录关联的,此时对象与加载它的Session发生关联;

    第二种,瞬时状态的对象,通过Session的save()方法或SaveOrUpdate()方法时,Java对象也与Session发生关联。

  对于处于持久状态的对象,Session会持续跟踪和管理它们,如果对象的内部状态发生了任何变更,Hibernate会选择合适的时机(如事务提交时)将变更固化到数据库中。

  • 游离状态

  处于持久状态的对象,脱离与其关联的nSession的管理后,对象就处于游离状态。

  处于游离状态的对象,Session无法保证对象所包含的数据与数据库中的记录一直,因为Hibernate已经无法感知对该对象的任何操作。

  Session提供了两个方法(update()、merge()),将处于游离状态的对象,与一个新的Session发生关联。

  此时,对象的状态就从游离状态重新转换为持久状态。

2.三种状态之间的转换:

使用new关键字构件对象,该对象的状态是瞬时状态。

1 .瞬时状态转为持久状态

  使用Session对象的save()或saveOrUpdate()方法保存对象后,该对象的状态由瞬时状态转换为持久状态。

  使用Session对象的get()或load()方法获取对象,该对象的状态是持久状态。

2. 持久状态转为瞬时状态

  执行Session对象的delete()方法后,对象由原来的持久状态变为瞬时状态,因为此时该对象没有与任何的数据库数据关联。

3. 持久状态转为游离状态

  执行了Session对象的evict()、clear()或close()方法,对象由原来的持久状态转为游离状态。

4 .游离状态转为持久状态

  重新获取Session对象,执行Session对象的update()或saveOrUpdate()方法,对象由游离状态转为持久状态,该对象再次与Session对象相关联。

5. 游离状态转为瞬时状态

  执行Session对象的delete()方法,对象由游离状态转为瞬时状态。

  处于瞬时状态或游离状态的对象不再被其他对象引用时,会被Java虚拟机按照垃圾回收机制处理。

    package com.haidiyixiaoyu.demo;  

    import org.hibernate.Session;
import org.junit.Test; import com.haidiyixiaoyu.domain.User;
import com.haidiyixiaoyu.utils.HibernateUtils;
//对象的三种状态
public class Demo1 {
@Test
//演示三种状态
public void fun1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User(); // 瞬时状态
u.setName("tom"); // 瞬时状态
u.setPassword("1234"); // 瞬时状态 session.save(u); // 持久状态
//问题: 调用完save方法,数据库中有没有对应记录?
// 没有对应记录, 但是最终会被同步到数据库中.仍然是持久状态.
//------------------------------------------------
session.getTransaction().commit(); // 持久状态
session.close(); // 游离状态
} @Test
//三种状态的转换
// 瞬时 => 持久
//瞬时:没有关联,没有id
//持久: 有关联,有id
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User(); // 瞬时状态
u.setName("tom"); // 瞬时状态
u.setPassword("1234"); // 瞬时状态 session.save(u); // 持久状态 save方法会使用主键生成策略,为User指定id. =>
//主键自增 => 打印 insert语句
//--------------------------// increment=> select max(id) ....
//assigned => 需要手动指定主键,不指定将会报错
session.getTransaction().commit(); // 持久状态
//事务提交时,会把持久化状态对象同步到数据库中
session.close(); // 游离状态
} // 瞬时=> 游离
// 瞬时: 没有关联,没有id
// 游离: 没有关联,有id(与数据库中对应的id)
@Test
public void fun3(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User(); // 瞬时状态 u.setId(1); //游离 //----------------------------------------------------
session.getTransaction().commit(); // 持久状态
//事务提交时,会把持久化状态对象同步到数据库中
session.close(); // 游离状态
}
@Test
// 持久=> 瞬时
// 持久: 有关联,有id
// 瞬时: 无关联,无id
public void fun4(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通过get方法,得到持久状态对象
User u= (User) session.get(User.class, 1); // 持久状态 //----------------------------------------------------
session.getTransaction().commit(); // 持久状态
//事务提交时,会把持久化状态对象同步到数据库中
session.close(); // 游离状态
u.setId(null);//瞬时状态
}
@Test
// 持久=> 瞬时
// 持久: 有关联,有id
// 瞬时: 无关联,无id
public void fun5(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通过get方法,得到持久状态对象
User u= (User) session.get(User.class, 1); // 持久状态 session.evict(u);//将User对象与session的关联移除 u.setId(null);//瞬时状态 session.save(u);//持久状态 //----------------------------------------------------
session.getTransaction().commit(); // 持久状态
//事务提交时,会把持久化状态对象同步到数据库中
session.close(); // 游离状态
}
// 持久=> 游离
@Test
// 持久=> 游离
//持久:有关联,有id
//游离:没有关联,有id(与数据库中对应的id)
// 只需要将session的关联取消
public void fun6(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通过get方法,得到持久状态对象
User u= (User) session.get(User.class, 1); // 持久状态 session.evict(u);//游离 //----------------------------------------------------
session.getTransaction().commit(); // 游离状态
session.close(); // 游离状态
} @Test
// 游离=> 瞬时
//游离:没有关联,有id(与数据库中对应的id)
//瞬时:无关联,无id
// 移除ID
public void fun7(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通过get方法,得到持久状态对象
User u= (User) session.get(User.class, 1); // 持久状态 session.evict(u);//游离 u.setId(null);// 瞬时 //----------------------------------------------------
session.getTransaction().commit(); // 瞬时状态
session.close(); // 瞬时状态
}
@Test
// 游离=> 持久
//游离:没有关联,有id(与数据库中对应的id)
//持久:有关联,有id
// 是否与Session关联
public void fun8(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通过get方法,得到持久状态对象
User u= (User) session.get(User.class, 1); // 持久状态 session.evict(u);//游离 session.update(u);//持久
//----------------------------------------------------
session.getTransaction().commit(); // 持久状态 -> 打印update语句
session.close(); // 瞬时状态
} //三种状态有什么用?
// 持久状态,我们使用Hibernate主要是为了持久化我们的数据.
// 对于对象的状态,我们期望我们需要同步到数据库的数据,都被转换成持久状态
//持久化状态特点: Hibernate会自动将持久化状态对象的变化同步到数据库中. @Test
public void fun9(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通过get方法,得到持久状态对象
User u= (User) session.get(User.class, 1); // 持久状态 u.setName("jerry");//持久状态 // u.setId(3);//与session建立关联的对象的ID,不允许修改. session.update(u);// 多余=> 因为Hibernate会自动将持久化状态对象的变化同步到数据库中. //----------------------------------------------------
session.getTransaction().commit(); // 持久状态 -> 打印update语句
session.close(); // 瞬时状态
} }

Hibernate实体对象的生命周期(三种状态)的更多相关文章

  1. DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    From http://blog.csdn.net/sunstone/article/details/5282666 DataSnap高级技术(7)—TDSServerClass中Lifecycle生 ...

  2. hibernate 持久化对象的生命周期 2.1

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  3. hibernate 持久化对象的生命周期

    持久化对象的生命周期 瞬态(自由态) 表示对象在内存中存在,在数据库中没有数据相关,比如刚刚new出来的一个对象 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象 ...

  4. hibernate学习笔记之三 持久化的三种状态

    Hibernate持久化对象有3中状态,瞬时对象(transientObjects),持久化对象(persistentObjects),离线对象(detachedObjects) 下图显示持久化三种状 ...

  5. Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    Lifecycle 三种属性: Session.Invocation.Server 这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明. 如果乱用这三种属性,你的服务程序有可 ...

  6. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  7. hibernate 实体对象的三种状态以及转换关系。

    最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient).持久态(managed, ...

  8. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  9. 【SSH系列】-- Hibernate持久化对象的三种状态

    在上一篇博文中,小编主要简单的介绍了[SSH系列]--hibernate基本原理&&入门demo,今天小编来继续介绍hibernate的相关知识, 大家知道,Java对象的生命周期,是 ...

随机推荐

  1. :成功配置 centos + nginx + .net core 2.0

    https://segmentfault.com/a/1190000010763523

  2. SVM的推导和理解

    主要记录了SVM思想的理解,关键环节的推导过程,主要是作为准备面试的需要. 1.准备知识-点到直线距离 点\(x_0\)到超平面(直线)\(w^Tx+b=0\)的距离,可通过如下公式计算: \[ d ...

  3. Nginx配置反向代理与负载均衡

    Nginx的upstream目前支持的分配算法: 1.round-robin 轮询1:1轮流处理请求(默认) 每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继 ...

  4. 【miscellaneous】星光级超低照度摄像机技术分析

    低照度摄像机采用了超灵敏度图像传感器和独有的电子倍增和噪点控制技术能够极大地提高摄像机的灵敏度,并且具备24小时全彩色实时效果,绝无普通低照度摄像机出现的拖尾现象,以满足对夜间高品质监控的需求.    ...

  5. echarts 饼图-->如何修改legend模板?

    首先需要在初始化图表的方法中过滤一下数据 ,将你需要的 名称  所占百分比 所占数量  筛选出来 let dataFilter = [ { value: 20, name: "未知" ...

  6. 四、Kubernetes_V1.10集群部署-master-创建kubeconfig

    1.生成配置文件 # 创建 TLS Bootstrapping Token # export BOOTSTRAP_TOKEN=$( /dev/urandom | od -An -t x | tr -d ...

  7. IIS服务搭建 试图加载格式不正确的程序

    1.基础步骤 https://jingyan.baidu.com/article/fedf073770f23335ac8977b1.html 2.错误解决 试图加载格式不正确的程序   解决:在IIS ...

  8. 洛谷 P2384 最短路 题解

    题面 这道题需要用到一个神奇的知识点:log(n*m)=log(n)+log(m): 所以对所有边权取个log,然后算log的最短路的同时维护乘积即可 #include <bits/stdc++ ...

  9. Comet OJ - Contest #14

    Rank38. 还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了. A 签到题. #include<bits/stdc++.h> using namespace std; #def ...

  10. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...