J2EE系列之Hibernate4学习笔记(六)--Hibernate中对象的4种状态

来源:互联网 发布:军团要塞知乎 编辑:程序博客网 时间:2024/05/22 19:55

Hibernate中对象共有四种状态,这四种状态分别为:

临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中。处于临时状态的Java 对象被称为临时对象。
持久化状态(persistent):已经被持久化,并且加入到Session 的缓存中。处于持久化状态的Java 对象被称为持久化对象。
删除状态(removed):不再处于Session 的缓存中,并且Session 已经计划将其从数据库中删除。处于删除状态的Java 对象被称为删除对象。
游离状态(detached):已经被持久化,但不再处于Session 的缓存中。处于游离状态的Java 对象被称为游离对象。


这里刚刚创建的对象,还没有调用session.save的对象为临时对象;调用了session.save后的对象为持久化对象;调用了session.delete,但是提交事物之前的对象为删除对象;session关闭后的对象成为游离对象。处于删除状态和游离化状态的对象可能会被垃圾回收器回收。对象的各个状态之间的转换过程如图所示:



下面通过例子来看一下对象的这几种状态。

1.复制工程Hibernate04命名为Hibernate05;

2.修改StudenTest.java文件为:

package com.test.service;import com.test.model.Class;import org.hibernate.Session;import org.hibernate.SessionFactory;import com.test.model.Student;import com.test.util.HibernateUtil;public class StudentTest {public static void main(String[] args) {SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 获取Session工厂Session session=sessionFactory.openSession(); // 生成一个session    session.beginTransaction(); // 开启事务        Class c1 = new Class();//临时对象1    c1.setName("08数学");            Class c2 = new Class();//临时对象2    c2.setName("09数学");        session.save(c1);//持久化对象    session.save(c2);//持久化对象                session.getTransaction().commit(); // 提交事务    session.close(); // 关闭session        System.out.println(c1.getName());//处于游离状态的对象}}

new出c1和c2时,这两个对象为临时状态。这两个状态会存储在内存中,状态如下:


调用session.save之后,对象c1和c2会保存到session缓存中,持久化后的c1和c2的存储状态为:



提交事务后c1和c2才会存储到数据库表中。关闭session后,对象c1和c2处于游离状态,此时它们还是能够取得到的。这时它们又会保存在内存中:




下面修改一下StudentTest.java文件为:

package com.test.service;import com.test.model.Class;import org.hibernate.Session;import org.hibernate.SessionFactory;import com.test.model.Student;import com.test.util.HibernateUtil;public class StudentTest {public static void main(String[] args) {SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); // 获取Session工厂Session session=sessionFactory.openSession(); // 生成一个session    session.beginTransaction(); // 开启事务        Class c1 = new Class();//临时对象1    c1.setName("08数学");            Class c2 = new Class();//临时对象2    c2.setName("09数学");        session.save(c1);//持久化对象    session.save(c2);//持久化对象        session.delete(c2);//删除对象            session.getTransaction().commit(); // 提交事务    session.close(); // 关闭session        System.out.println(c1.getName());//游离对象    System.out.println(c2.getName());//删除状对象}}

这里提交事务前c2成了游离对象,提交事务后c2在数据库表中会被删除。

由于函数还没有结束,此时c2也是能够取到的,此时c2也是保存在内存中。




0 0
原创粉丝点击