4 持久化对象生命周期
- 准备工作:准备如下数据库表一张,方便说明问题。主键设置为自动增长
id int(11) NOTNULL
name varchar(30) NOTNULL
age int(11) NOTNULL
address varchar(255) NULL
Student实体类和映射文件与第一节类似不再重述。 - 瞬时状态
Student stu=new Student();
stu.setName(“SomeOne”);
stu.setAge(18);这里的stu和hibernate框架以及数据库完全没关系,程序运行时,它仅仅被放入内存,程序结束就消失
- 持久状态
对于Hibernate纳入实体管理容器的对象,我们则定义为对象处于持久态
exp:
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();Student stu1 = new Student();
stu1.setName("某王");
stu1.setAge(18);
Student stu2 = new Student();
stu2.setName("LiLittleDragon");
stu2.setAge(19);
/*** 上面创建了两个对象,这两个对象(stu1,stu2)都处于瞬时状态
*/
Transaction tx = session.beginTransaction();
session.save(stu1);
/**
*此时已经将stu1存入session
*stu1已经Hibernate容器所管理因此处于持久态
*需注意虽然已经处于瞬时态
*但是因为事务还没有提交(还没有调用commit()方法)
*所以数据库中并没有存在数据,
*stu2此时仍是是瞬时态
*/
tx.commit();
/*
*stu1的数据已在数据库中
*/
tx=session.beginTransaction();
stu1.setName("LeafAsk");
tx.commit();
/*因为session未被关闭,所以stu1依然处于持久化状态,因此
*再commit(),数据库中数据库中stu1的名字会变成叶问,但是stu2还是瞬时态
*/
HibernateSessionFactory.closeSession();
/*运行程序会出现一条insert和一条update*/
}
- 游离状态
处于 Persistent 状态的对象,其对应的 Session 实例被关闭之后,那么,此对象就处于 Detached 状态
public static void main(String[] args) {
Session session=HibernateSessionFactory.getSession(); Student stu=new Student();
stu.setName("xxx");
stu.setAge(25);
Transaction tx=session.beginTransaction(); session.save(stu);
tx.commit(); HibernateSessionFactory.closeSession();//这里session被关闭,对象变为游离态
System.out.println(stu.getId());}
- 游离状态与瞬时状态的两点区别
区别在于游离状态的对象可以再次与有个Session进行关联而成为持久对象
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Student stu=new Student();
stu.setName(“one");
stu.setAge(25);
Transaction tx = session.beginTransaction();
session.save(stu);
tx.commit();
HibernateSessionFactory.closeSession(); //session被关闭,对象变为游离态
session = HibernateSessionFactory.getSession();//session被重新打开
tx = session.beginTransaction();session.update(stu);//stu重新与session关联,称为持久态
stu.setName("two");
tx.commit();
HibernateSessionFactory.closeSession();}
- VO与PO
有时候,为了方便,我们也将处于瞬时状态和游离状态状态的对象称为 VO(Value Object)值对象,而处于持久化状态的对象称为 PO(Persistent Object)