【背景介绍】

    这些天看了Hibernate的持久化对象的三个状态,突然想到了它与我学生时代的生活很相似:

      1、当我还是一个学生的时候也就是具体的对象

      2、学校的教室相当于数据库,其中的座位相当于表结构


      3、教室中的上课老师就相当于Session


    当我到学校的时候,我处于瞬时状态,此时我被学校引用;

    当我得知自己要上某一个老师的课的时候,到了那个时间点我就处于持久化状态(这时老师可以将我安置到教室的某个座位上去);

    当我正在上课的时候这时老师出去去厕所了(session关闭),这个时候我的心飞向了外面的远方,这时我就处于离线状态。

【概念分析】

    瞬时对象(Transisent Objects):使用new操作符初始化的对象不是立刻就持久的,它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。

    持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理(这里不是内存中的session),持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步,当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中

    离线对象(Detached Objects):Session关闭之后,持久化对象就变为离线对象,离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

    根据背景介绍的例子,再结合概念分析,然后对比下面这幅图,进行深刻思考O(∩_∩)O~

【java】——Hibernate持久化对象的三个状态_java

【代码示例】


  一、整体项目以及其中的类、配置文件结构图



【java】——Hibernate持久化对象的三个状态_hibernate_02


  二、测试持久化对象的三个状态的测试类(SessionTest.java)


-
package com.bjpowernode.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import junit.framework.TestCase;

/**
* SessionTest类
* @author mk
*
*/
public class SessionTest extends TestCase {

public void testSave3(){
Session session = null;
Transaction tx = null;
User user = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

//Transaction状态
//(此时我就是这里实例化出来的user,我需要找到被引用的学校)
user = new User();
user.setName("张三");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//Persistent状态
//persistent状态对象,当对象的属性发生改变的时候
//hibernate清理缓存(脏数据检查)的时候,会和数据库同步
//下面语句就是老师将我安置到对应的座位上的过程
session.save(user);
user.setName("李四");
//可以显示的调用update,此时为持久状态,调用update的方法没什么意义!
session.update(user);
tx.commit();

} catch (Exception e) {
e.printStackTrace();
if (tx != null) {
tx.rollback();
}
}finally{
HibernateUtils.closeSession(session);
}
//detached状态
//老师去厕所了,我的心到了外面,我成为了游离状态
user.setName("王五");
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//将detached状态的对象重新纳入session管理(这个时候是老师回来了,把我的心叫了回来)
//此时将变为persistent状态的对象
//persistent状态的对象,在清理缓存时会和数据库同步
session.update(user);
session.getTransaction().commit();

} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}

}
-

  三、工具类(HibernateUtils.java)


-
package com.bjpowernode.hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

//定义私有变量sessionFactory
private static SessionFactory factory;

//设定静态初始化
static{
try {
//默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();

factory = cfg.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}

//返回打开的session
public static Session getSession(){
return factory.openSession();
}

//设定关闭session方法
public static void closeSession(Session session){
if (session != null) {
if (session.isOpen()) {
session.close();
}
}
}

//设定返回sessionfactory的方法
public static SessionFactory getSessionFactory(){
return factory;
}
}
-

  四、用户列表对应的类(User.java)


-
package com.bjpowernode.hibernate;

import java.util.Date;

/**
* 用户表对应的类
* @author mk
*
*/
public class User {

private String id;

private String name;

private String password;

private Date createTime;

private Date expireTime;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Date getCreateTime() {
return createTime;
}

public void setCreateTime(Date createTime) {
this.createTime = createTime;
}

public Date getExpireTime() {
return expireTime;
}

public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
}
}
-

  五、用户列表对应的配置文件(User.hbm.xml)


-
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping >
<!-- 用户表对应的配置内容 -->
<class name="com.bjpowernode.hibernate.User">
<!-- 主键的配置 -->
<id name="id">
<generator class="uuid"/>
</id>
<property name="name"/>
<property name="password"/>
<property name="createTime"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
-

  六、数据库连接以及配置用户列表配置文件链接的文件(Hibernate.cfg.xml)


-
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_session</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MckoiDialect</property>
<property name="hibernate.show_sql">true</property>

<!-- 与用户表配置文件对应的配置 -->
<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
-

【总结】

    只恨时光太匆匆,我永远回不到持久化状态了,我也很清楚那个时光对于每个人来说都非常重要,因为它是积攒力量的阶段,它将会是你将来在社会中奋起的力量。


    在学习知识的同时也让我回忆了一下学生时代的美丽时光,也许这也就是做为一个程序猿美好的乐趣所在吧O(∩_∩)O~

    用一颗朴实的心面对每一天每一件事,同时迎接下一个美好的到来O(∩_∩)O~