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

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

【背景介绍】


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


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


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


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

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


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


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


【概念分析】


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


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


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


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


20160913124833615.png


【代码示例】


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


20160913124848772.png


 二、测试持久化对象的三个状态的测试类(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~

相关文章
|
22小时前
|
安全 Java 编译器
java中类与对象回顾总结-2
java中类与对象回顾总结
16 3
|
23小时前
|
Java 编译器
java中类与对象回顾总结-1
java中类与对象回顾总结
14 3
|
22小时前
|
Java
【专栏】Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性
【4月更文挑战第27天】本文探讨了Java反射机制,该机制允许程序在运行时获取类信息、动态创建对象、调用方法和访问属性。反射通过Class、Constructor、Method和Field类实现。文中列举了反射的应用场景,如动态创建对象、调用方法、访问属性和处理注解,并提供了相关实例代码演示。
|
22小时前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
9 4
|
22小时前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
22 4
|
22小时前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
22小时前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
22小时前
|
Java
从源码出发:JAVA中对象的比较
从源码出发:JAVA中对象的比较
19 3
|
22小时前
|
Java
Java一分钟之-类与对象:面向对象编程入门
【5月更文挑战第8天】本文为Java面向对象编程的入门指南,介绍了类与对象的基础概念、常见问题及规避策略。文章通过代码示例展示了如何定义类,包括访问修饰符的适当使用、构造器的设计以及方法的封装。同时,讨论了对象创建与使用时可能遇到的内存泄漏、空指针异常和数据不一致等问题,并提供了相应的解决建议。学习OOP需注重理论与实践相结合,不断编写和优化代码。
28 1
|
23小时前
|
SQL Java 数据库连接
15:MyBatis对象关系与映射结构-Java Spring
15:MyBatis对象关系与映射结构-Java Spring
31 4