对象的状态(生命周期)
1、瞬时状态(瞬态,临时状态,Transient)
User user = new User();
user.setUid(1001);
user.setName("张三");//T
在此之前该对象都是Transient
session.save(user);//P
session.close();
user.setName("李四");//D
临时创建出的一个对象,session没有对该对象
做任何管理,该对象在数据库中没有与之对应的
记录
2、持久态(Persistent)
session 对该对象做了操作
session.save(user);
此时该对象变成Persistent
该对象被纳入到了session的管理(get,load,save
update....),该对象在数据库中有与之对应的
记录,对象的属性值发生变化,数据库会发生联动(
hibernate会发出update语句
)
3、游离态(托管状态 Detached)
该对象没有被纳入到了session的管理(对象不再与
某个session关联),该对象在数据库中有与之对应的
记录
案例说明:
package com.tarena.test;
import org.hibernate.Session;
import org.junit.Test;
import com.tarena.demo.po.User1;
import com.tarena.demo.util.HibernateUtils;
public class TestLifeCycle {
/**
* 对象的三种状态转换
*/
@Test
public void test01(){
User1 user = new User1();
user.setUserName("张三");
user.setUserPassword("123456");//Transient(瞬态)
Session session = HibernateUtils.getSession();
session.save(user);//Persistent(持久态)
session.beginTransaction().commit();
session.close();
//如果session不关,使对象变为托管态,可以session.evict(user);从session中驱逐出去
//session.evict(user);
user.setUserName("李四");//Detached(托管态)
session = HibernateUtils.getSession();
session.delete(user);
session.beginTransaction().commit();
session.close();
user.setUserName("王五");//Transient
}
/**
* 处于持久态对象,数据库中的记录会与该对象的属性值的变化发生联动
*/
@Test
public void test02(){
User1 user = new User1();
user.setUserName("张三1");
user.setUserPassword("123456");
Session session = HibernateUtils.getSession();
session.save(user);
user.setUserName("李四");
System.out.println("----------------------");
session.beginTransaction().commit();//在commit的时候,会调用flush()方法,如果
//对象的值和数据库中的值不一样的时候,执行update操作
session.close();
/**
* 运行结果:
* Hibernate:
insert
into
t_user
(userName, userPassword)
values
(?, ?)
----------------------
Hibernate:
update
t_user
set
userName=?,
userPassword=?
where
uid=?
*/
}
/**
* 持久态对象属性值发生变化,发送update语句的时机和原理案例
*/
@Test
public void test03(){
User1 user = new User1();
user.setUserName("张三1");
user.setUserPassword("123456");
Session session = HibernateUtils.getSession();
session.save(user);
user.setUserName("李四");
//刷新session
session.flush();
System.out.println("----------------------");
session.beginTransaction().commit();
session.close();
/**
* 运行结果:
* Hibernate:
insert
into
t_user
(userName, userPassword)
values
(?, ?)
Hibernate:
update
t_user
set
userName=?,
userPassword=?
where
uid=?
----------------------
*/
}
/**
* 持久态对象属性值发生变化,测试evict()方法
*/
@Test
public void test04(){
User1 user = new User1();
user.setUserName("张三1");
user.setUserPassword("123456");
Session session = HibernateUtils.getSession();
session.save(user);//持久态(该对象在session的缓存中)
//从session的缓存中清除
//session.evict(user);//游离态
session.clear();//清空session缓存中的数据
user.setUserName("张三2");
session.beginTransaction().commit();
session.close();
/**
* 运行结果:
* Hibernate:
insert
into
t_user
(userName, userPassword)
values
(?, ?)
*/
}
}