Hibernate---对象的三种状态

来源:互联网 发布:源码资本投资的项目 编辑:程序博客网 时间:2024/05/24 03:26

Hibernate---对象的三种状态

1、Hibernate对象有三种状态,分别是:临时态(瞬时态)、持久态(同步态)、游离态(托管态);以下定义引用别人的话:

临时态:当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有

变量引用这个对象,则会被jre垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session

的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象。

瞬时对象具有如下特点:

1、在数据库中没有与之关联的记录

持久态:持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。对持久化对象进行delete

操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象

变成临时状态。

持久对象具有如下特点: 

1. 和session实例关联; 
2. 在数据库中有与之关联的记录。
 

游离态: 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session

上时,并再次转变成持久对象。脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象。

脱管对象具有如下特点: 
1. 本质上与瞬时对象相同,在没有任何变量引用它时,JVM会在适当的时候将它回收; 
2. 比瞬时对象多了一个数据库记录标识值。

三者之间的转换方式如下图所示:


下面,我们来演示一个实例:

1、新建一个Java工程,添加Hibernate 3.3支持

2、选中t_user表进行反向生成,在src生成下生成com.etc.dao包,在包下自动生成TUser.java和TUser.hbm.xml文件

public class TUser implements java.io.Serializable {private Integer id;private String username;private String password;        getter/setter()方法}
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping>    <class name="com.etc.dao.TUser" table="t_user" catalog="test">        <id name="id" type="java.lang.Integer">            <column name="id" />            <generator class="native" />        </id>        <property name="username" type="java.lang.String">            <column name="username" />        </property>        <property name="password" type="java.lang.String">            <column name="password" />        </property>    </class></hibernate-mapping>
3、配置hibernate.cfg.xml文件

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   --><hibernate-configuration><session-factory><property name="current_session_context_class">thread</property><property name="show_sql">true</property><property name="format_sql">true</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.url">jdbc:mysql://localhost:3306/test</property><property name="connection.username">root</property><property name="connection.password">root</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property><mapping resource="com/etc/dao/TUser.hbm.xml" /></session-factory></hibernate-configuration>
4、在工程下新建test文件夹,在文件夹下新建com.etc.dao包,在包下新建TUserDAOTest.java类:

package com.etc.dao;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class TUserDAOTest {@Testpublic void test1(){//1、得到数据库映射SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//2、得到数据库连接Session session = sessionFactory.getCurrentSession();//3、开启事务session.beginTransaction();//4、进行数据库相关的操作//对象的第一种状态:临时态:刚刚被new出来的对象,跟hibernate无关TUser tuser = new TUser();tuser.setUsername("zoey");tuser.setPassword("123");//临时态--->对象的第二种状态:持久态:调用session的save()或者saveOrUpdate()方法之后,不需要update,
会自动同步到数据库(直接调用对象的set方法就可以)//持久态:受hibernate管理,在数据库中有相应的数据session.save(tuser);tuser.setUsername("aaaa");System.out.println(tuser.getId());//持久态--->对象的第三种状态:游离态:持久态调用session的evict()或者close()或者clear()方法之后,
不受hibernate管理,但数据库中有对应的数据session.evict(tuser);//tuser.setUsername("bbb");//这行代码不会生效System.out.println(tuser.getId());//5、提交事务session.getTransaction().commit();}@Testpublic void test2(){//1、得到数据库映射SessionFactorySessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();//2、得到数据库连接Session session = sessionFactory.getCurrentSession();//3、开启事务session.beginTransaction();//4、进行数据库相关的操作//持久态:直接调用session的get()或者load()方法TUser tuser = (TUser)session.get(TUser.class,4);tuser.setPassword("pass");//持久态--->临时态session.delete(tuser);tuser.setPassword("aa");//这行代码不会生效//临时态--->持久态session.save(tuser);//持久态--->游离态session.clear();//5、提交事务session.getTransaction().commit();}}
总结:

1、临时态:就是刚刚new出来的对象,通过对象的set()方法改变对象的属性值,但不会真的同步到数据库中,也就

和数据库无关。只有调用session.save()方法之后,变成持久态,使用set方法改变对象的属性值,才会真的同步到

库。持久态调用session.delete()方法之后,变成临时态。临时态不受hibernate的管理,并且在数据库中没有对

的数据。

2、持久态:临时态调用session.save()或者session.saveOrUpdate()方法之后,就会变成持久态;或者通过调用

session.get()或session.load()方法之后就会变成持久态;对象变成持久态之后,只需要通过类的set方法就可以改

变对象的属性值,并且直接更新到数据库,并不需要调用什么update方法。持久态受hibernate的管理,并且在数据库

有对应的数据。

3、游离态:持久态调用session.evict()或者session.close()或者session.clear()方法就可以变成游离态。变成

离态之后,不受hibernate管理,但是在数据库中还有对应的ID字段。