【背景介绍】
这些天看了Hibernate的持久化对象的三个状态,突然想到了它与我学生时代的生活很相似:
1、当我还是一个学生的时候也就是具体的对象
2、学校的教室相当于数据库,其中的座位相当于表结构
3、教室中的上课老师就相当于Session
当我到学校的时候,我处于瞬时状态,此时我被学校引用;
当我得知自己要上某一个老师的课的时候,到了那个时间点我就处于持久化状态(这时老师可以将我安置到教室的某个座位上去);
当我正在上课的时候这时老师出去去厕所了(session关闭),这个时候我的心飞向了外面的远方,这时我就处于离线状态。
【概念分析】
瞬时对象(Transisent Objects):使用new操作符初始化的对象不是立刻就持久的,它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。
持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理(这里不是内存中的session),持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步,当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中
离线对象(Detached Objects):Session关闭之后,持久化对象就变为离线对象,离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
根据背景介绍的例子,再结合概念分析,然后对比下面这幅图,进行深刻思考O(∩_∩)O~
【代码示例】
一、整体项目以及其中的类、配置文件结构图
二、测试持久化对象的三个状态的测试类(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~