hibernate2(对象的三种状态)

hibernate中对象分为三种状态:瞬时状态,游离状态,持久状态

 

在此之前必须了解hibernate的缓存概念,在hibernate中用来执行CRUD的对象是Session类的实例,Session本身是具有缓存性质的。通常大家所说的一级缓存就存在于Session之中,你可以将它想象成一个Map里面装了一些要操作的对象。

 

开始实验:

1.实体类:

public class Student {

	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

}

2. 映射文件:

<hibernate-mapping package="org.zengge.hibernate.pojo">
    <class name="Student" table="student" lazy="true">
        <id name="username" type="java.lang.String" column="username">
            <generator class="native"></generator>
        </id>
        <property name="password" type="java.lang.String" column="password"></property>
    </class>
</hibernate-mapping>

 

3.hibernate配置文件:

<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://192.168.1.103:3306/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="show_sql">true</property>
        <mapping resource="org/zengge/hibernate/pojo/Student.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 

4.获取Session及SessionFactory的公共类HibernateUtils

public class HibernateUtils {

	public static final SessionFactory sessionFactory = getSessionFactory();
	
	public static SessionFactory getSessionFactory(){
		Configuration configuration = new Configuration().configure();
		return configuration.buildSessionFactory();
	}
	
	public static Session getSession(){
		return sessionFactory.getCurrentSession();
	}
	
	public void closeSession(Session session){
		if(session!=null){
			if(session.isOpen()){
				session.close();
			}
		}
	}
}
 

 

4.瞬时对象

瞬时对象,比较简单,它在数据库中不存在,在Session的缓存中也不存在。当JVM关闭时,它就会消失。

可以想象,就是当我们new一个对象出来时,只要这个对象不与数据库中某条记录一致,那么它就是个瞬时对象。

public void TestTransient(){
        Student student = new Student();//瞬时对象
   } 

当此方法调用结束,这个student瞬时对象就消失了。

 

5.持久对象

持久对象,在数据库中存在,在Session的缓存中也存在。session的save,saveorupdate可以将瞬时对象转换成持久对象。delete方法可以将持久对象转换成瞬时对象。最重要的一点,对持久对象的操作,会自动与数据库中数据同步,

所以对持久对象操作时要小心。

public void Testpersistent(){
		
                Student student = new Student();//瞬时对象
		Session session = HibernateUtils.getSession();//获取session
		//开启事务
		Transaction tr = session.beginTransaction();
		session.save(student);
		//save后成为持久状态,接下来对student操作,会自动与数据库同步
		student.setPassword("skycn");
		tr.commit();//在事务提交时,session会将数据写入数据库并清空缓存
		session.close();//操作完成,关闭session
		
	}
 

6.游离对象

游离对象,在数据库中存在,在session的缓存中不存在。

public void Testdetached(){
        Session session = HibernateUtils.getSession();
        //开启事务
        Transaction tr = session.beginTransaction();
        Student student = new Student();//它的状态不能确定,可能是瞬时,也可能是游离,
        session.save(student);
        //save后成为持久状态,接下来对student操作,会自动与数据库同步
        student.setPassword("skycn");
        tr.commit();//在事务提交时,session会将数据写入数据库并清空缓存
        session.close();//操作完成,关闭session
        //session关闭,清空缓存,student由持久对象变成游离对象
        System.out.println(student.getUsername()+" "+student.getUsername());
    }

 

7.对象之间相互转换的图示

通过不同的方法调用,对象的状态会发生相应的变化。


hibernate2(对象的三种状态)

 

你可能感兴趣的:(jvm,sql,Hibernate,mysql,jdbc)