实体对象的生命周期中主要存在三种不同的状态,它们分别是Transient(瞬态)、Persistent(持久态)、Detached(游离态)。一个实体对象的实体通过不同的操作可以在这三种状态之间转换。
1、Transient(瞬态)
所谓瞬态,表示该实体对象在内存中是自由存在的,也就是与数据库中的数据没有任何关系。
下面来看一段代码:
//创建一个瞬态对象
User user = new User();
user.setName("lisi");
user.setPasswd("123456");
//此时,user仍然是一个瞬态对象
瞬态的实体对象具有以下几个特征:
- 与数据库中的记录没有任何关系,也就是没有与其相关联的数据库记录。
- 与Session没有任何关系,也就是没有通过Session对象的实例对其进行过任何持久化的操作
2、Persistent(持久态)
所谓持久态,是指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Seesion对象的实例相关的。处于持久态的实体对象的最大特征是对其所做的任何变更操作都将被Hibernate持久化到数据库中。
下面来看一段代码:
//创建一个瞬态对象
User user = new User();
user.setName("lisi");
user.setPasswd("123456");
//此时,user还是一个瞬态对象
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
//在此时,use依然还是一个瞬态对象
session.save(user);
//此时,user对象已经被纳入了Hibernate的实体管理容器中,并转变为Persistent状态
tx.commit;
//事务提交后,将向数据库的用户表中插入一条记录
Transaction tx2 = session.beginTransaction();
user.setPasswd("654321");
tx2.commit();
//虽然在这个事务中并没有调用Session的save()方法来保存user对象
//但由于user对象处于持久态
//所以对user对象所做的任何修改都将被持久化到数据库中
//那么数据库中的用户密码也就变为了“654321”.
session.close();
上述例子是利用Sessioin的save()方法进行持久化操作,使得瞬态对象变为持久化对象。当然也可以通过查询让Hibernate直接返回一个持久化对象。
下面来看一段代码:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User)session.load(User.class,"402881e406c983520106c98356c5000a");
//Hibernae在返回User对象之前会将其纳入到Hibernate的实体对象中
//所以,这时的user对象是持久化状态
tx.commit();
session.close();
处于持久化状态的实体对象具有如下特征:
- 每个持久化状态的实体对象都与一个Session对象的实例相关联。
- 处于持久化状态的实体对象是与数据库中的记录相关联的。
- Hibernate会依据持久化状态的实体对象的属性变化而改变数据库中相应的记录。
3、Detached(游离态)
所谓游离态,是指处于持久化状态的对象,当不再与它所对应的Seesion对象相关联时,这个对象就变成了游离态。
下面来看一段代码:
在运行了Session对象的close()方法后,user对象就由持久态变成了游离态。//创建一个瞬态对象 User user = new User(); user.setName("lisi"); user.setPasswd("123456"); //此时,user还是一个瞬态对象 Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); //在此时,use依然还是一个瞬态对象 session.save(user); //此时,user对象已经被纳入了Hibernate的实体管理容器中,并转变为Persistent状态 tx.commit; //事务提交后,将向数据库的用户表中插入一条记录 session.close();
//user对象此时变成了游离态
游离态的对象具有如下特征:
- 游离实体对象一定是由持久态实体对象转变而来的。
- 游离实体对象不再与Seesion对象相关联。
- 游离实体对象与数据库中的数据没有直接联系,主要表现在对其所进行的修改将不再影响数据库中的数据。
- 游离态实体对象在数据库中有相对应的数据记录(如果该数据记录没有被删除)。
最后来一张对象状态转换图: