【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对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
13天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
28 3
|
26天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
45 17
|
25天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
1月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
29 6
|
1月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
24 3
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第3天】Java零基础教学篇,手把手实践教学!
19 1
|
25天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
24 0
|
1月前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
12 0
下一篇
无影云桌面