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