public class QueryTest {
/***
* 形象理解Hibernate的三种状态
* Transient(瞬时态):DB无记录,和Session无关(有内在状态,无外在状态,不需要同步)
* Persistent(持久态):DB有记录,和Session有关(有内在状态,有外在状态,Session作同步)
* Detached(脱管态):DB有记录,和Session无关(有内在状态,有外在状态,手工同步)
* 下面以一段Hibernate新增数据操作为例,让我们真正明白到底什么是Hibernate对象的三种状态
* @param args
* 2010-3-24
*/
public static void main(String args[]){
//==========================瞬时态
User u=new User();
u.setName("wangwei");//当程序new一个对象时,这时它还没有和Session关联,数据库中也没有这个对象的记录,
//此时该对象的状态就被称为“瞬时态”
u.setBirthday(new Date());
//==========================瞬时态
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
//==========================持久态
session.save(u); //当session调用save()方法后,此时hibernate session中会有该对象,数据库也会有该对象的数据库(如果没有提交,数据库会自动回滚数据)
u.setName("wangyechun");//在“瞬时态”中当对象状态发生改变时(也就是说对象中有属性值发生了改变),Hibernate 会同步更新该对象对应数据库中的状态。
//hibernate这时我会生成一条插入和更新的语句来完成session和数据库的同步
//Hibernate: insert into User (name, birthday) values (?, ?)
//Hibernate: update User set name=?, birthday=? where id=?
//这就是hibernate生成的两条sql语句
//==========================持久态
tx.commit();
}finally{
if(session!=null){
session.close();
}
//============================脱管态
System.out.println(u.getId());//当session被关闭以后此时的User 对象就变成了脱管状态了,它已经和session无关了
//它和“瞬时态”的区别是:瞬时态id没有值,而脱管态id是有值的。
//============================脱管态
}
}
}