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.对象之间相互转换的图示
通过不同的方法调用,对象的状态会发生相应的变化。