【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~

相关文章
|
1月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
271 0
|
3月前
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
3月前
|
存储 人工智能 JavaScript
Java从作用域到对象高级应用​
本内容详细讲解了JavaScript中的作用域类型(函数作用域、块作用域、全局作用域)、作用域链、垃圾回收机制、闭包、变量提升、函数参数、数组方法、内置构造函数、对象高级知识、原型链、对象赋值、深浅拷贝、递归、异常处理及this指向等内容,全面覆盖JS核心概念与编程技巧。
53 0
|
4月前
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
103 0
|
4月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
155 2
|
5月前
|
Java 数据库连接 API
Java 对象模型现代化实践 基于 Spring Boot 与 MyBatis Plus 的实现方案深度解析
本文介绍了基于Spring Boot与MyBatis-Plus的Java对象模型现代化实践方案。采用Spring Boot 3.1.2作为基础框架,结合MyBatis-Plus 3.5.3.1进行数据访问层实现,使用Lombok简化PO对象,MapStruct处理对象转换。文章详细讲解了数据库设计、PO对象实现、DAO层构建、业务逻辑封装以及DTO/VO转换等核心环节,提供了一个完整的现代化Java对象模型实现案例。通过分层设计和对象转换,实现了业务逻辑与数据访问的解耦,提高了代码的可维护性和扩展性。
230 1
|
5月前
|
前端开发 Java 数据库连接
java bo 对象详解_全面解析 java 中 PO,VO,DAO,BO,POJO 及 DTO 等几种对象类型
Java开发中常见的六大对象模型(PO、VO、DAO、BO、POJO、DTO)各有侧重,共同构建企业级应用架构。PO对应数据库表结构,VO专为前端展示设计,DAO封装数据访问逻辑,BO处理业务逻辑,POJO是简单的Java对象,DTO用于层间数据传输。它们在三层架构中协作:表现层使用VO,业务层通过BO调用DAO处理PO,DTO作为数据传输媒介。通过在线商城的用户管理模块示例,展示了各对象的具体应用。最佳实践包括保持分层清晰、使用工具类转换对象,并避免过度设计带来的类膨胀。理解这些对象模型的区别与联系。
412 1
|
6月前
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
137 12
|
7月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
238 23
|
7月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
173 1