分享自:  http://blog.csdn.net/jnqqls/article/details/8276059

在我们之前的文章已经了解到,Hibernate的汉语解释叫做冬眠,而这个冬眠我个人理解跟Persistence有着一定的关系,也就是让那些数据去睡觉.具体怎么睡,Hibernate提供了一些解决方案.

什么是持久化?

几乎所有的程序都会用到持久化数据.持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。

持久化的关键就是为了防止内存的数据会丢失,所以我们要把它保存在存储设备中,以便下次需要的时候可以再把数据取出来再说白点就是把数据存到硬盘上等不会丢失的地方.

估计你和我一样,所打交道的数据库基本上都是关系型数据库,一般我们通过java程序来对数据库进行操作是通过Java DataBaseConnecctive(JDBC)API,我们通过JDBC
API 来绑定数据,查询数据,从结果集中获取数据等等,这些都是底层的数据操作,但是作为一个应用程序开发人员,我们更应该把精力放在对业务的处理上,而不是这些底层数据的处理.

Hibernate为我们提供了一种方案,通过面向对象的思维来实现ORM(Object/Relational
Mapping),要想理解Hibernate是如何将对象存储到关系型数据库中,需要进一步去了解持久化对象的状态.

持久化对象都有哪些状态?

  • 瞬时对象(Transient Objects)使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。
  • 持久化对象(Persist Objects)持久实例是任何具有数据库标识的实例。它有持久化管理器Session统一管理,持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。
  • 离线对象(Detached Objects)Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
  • 以下图片示例便是上述三个状态的相互转换.

接下来我们通过一个小实例对着三种状态进行代码解释,对应着上面的图和下面的代码,进一步去理解Persistence及持久化对象的状态转变.

这里我们借用上一篇文章中的例子,在上篇文章Hibernate
之 How
我们通过一个实例来讲解如何使用Hibernate,接下来我们会借用其中客户端的代码来进行持久化对象状态的演示,其它相关代码请参阅前一篇文章.

代码如下,具体分析可以参看注解.

  • 建立client
  1. package com.tgb.hibernate;
  2. import java.util.Date;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.Configuration;
  6. /**
  7. * 客户端程序
  8. * @author   jnqqls
  9. * @group    TGB
  10. * @version  2.0
  11. * @datetime 2012-12-9 22:08:23
  12. * @comments
  13. */
  14. public class Client {
  15. /**
  16. * @param args
  17. */
  18. public static void main(String[] args) {
  19. // 读取hibernate.cfg.xml文件
  20. Configuration cfg = new Configuration().configure();
  21. // 建立SessionFactory,对应一个数据库的镜像.
  22. SessionFactory factory = cfg.buildSessionFactory();
  23. // 获得session
  24. Session session = null;
  25. try {
  26. // 工厂创建session,并获得.
  27. session = factory.openSession();
  28. // 手动开启事务
  29. session.beginTransaction();
  30. // 创建User实体
  31. //--------------------从这里开始user对象处于Transient状态---------------
  32. User user = new User();
  33. user.setName("jnqqls");
  34. user.setPassword("jnqqls");
  35. user.setCreateTime(new Date());
  36. user.setExpireTime(new Date());
  37. // 保存user对象
  38. //--------------从这里开始user对象处于Persistent状态--------------
  39. /*Persistent状态的对象,当对象的属性发生改变的时候,
  40. hibernate在清理缓存(脏数据)的时候会和数据库同步
  41. */
  42. session.save(user);
  43. // 提交事务
  44. session.getTransaction().commit();
  45. } catch (Exception e) {
  46. // 这里只是简单打印一下堆栈,用于测试
  47. e.printStackTrace();
  48. //事务回滚.
  49. session.getTransaction().rollback();
  50. } finally {
  51. // session是否为null
  52. if (session != null) {
  53. // session是否打开
  54. if (session.isOpen()) {
  55. // 关闭session
  56. session.close();
  57. }
  58. }
  59. }
  60. //-------------------此时user对象处于Detacched状态-------------------
  61. }

接下来对Hibernate的持久化状态进行一个简单总结.

是否被Session管理

是否在数据库有记录

Transeint

Persistent

Detached

理解持久化的概念对我们学习Hibernate非常有用.持久化概念是Hibernate核心概念之一,会对我们随后的Hibernate Mapping 和Hibernate
Cache都有帮助.

Hibernate 之 Persistence的更多相关文章

  1. hibernate之persistence错误

    错误码: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityM ...

  2. 用hibernate tools生成对应的sql应用代码

    参考资料: eclipse在线配置hibernate tools http://jingyan.baidu.com/article/db55b609959d154ba20a2f5d.html [图]H ...

  3. Hibernate 基础配置及常用功能(三)

    本章重点讲述Hibernate对象的三种状态以及如何配置二级缓存 有关Hibernate的三种状态如何相互转换网上都能查到,官方文档描述的也比较详细.这里主要是针对几个重点方法做代码演示. 一.状态转 ...

  4. Hibernate项目用Maven创建(转)

    本文将用Maven3.Hibernate3.6.Oracle10g整合,作为例子. 环境清单: 1.Maven3.0.5 2.Hibernate3.6.5 Final 3.JDK1.7.0.11 4. ...

  5. hibernate下载包中配置文件路径

    路径:hibernate-release-5.0.2.Final\project\hibernate-ehcache\src\test\resources\hibernate-config 文件:hi ...

  6. Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一)

    相关的maven的 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  7. Maven3路程(五)用Maven创建Hibernate项目

    本文将用Maven3.Hibernate3.6.Oracle10g整合,作为例子. 环境清单: 1.Maven3.0.5 2.Hibernate3.6.5 Final 3.JDK1.7.0.11 4. ...

  8. JPA 2.1实例(hibernate 实现)

    1.环境准备 1)java se 7 2)maven 3 3)mysql database 2.创建数据库和表结构 首先创建数据库.创建数据库脚本如下: create database jpa; 创建 ...

  9. Hibernate 映射字段问题[ImprovedNamingStrategy]

    Hibernate 使用JPA 对于映射有3种规则能够配置:DefaultNamingStrategy,ImprovedNamingStrategy,EJB3NamingStrategy 这里仅仅说I ...

随机推荐

  1. 痛苦的版本对齐(3) cygwin下的路径引用(sed解决篇)

    上次问题(见http://www.cnblogs.com/yvivid/p/3546649.html),.depend信息路径错误的问题. 主要尝试了,在(虚拟机下构建)linux下编译,确实没有问题 ...

  2. style对象的cssText方法

    cssText 本质是什么? cssText 的本质就是设置 HTML 元素的 style 属性值. cssText 怎么用? domElement.style.cssText = "col ...

  3. LeetCode(16)3Sum Closest

    题目 Given an array S of n integers, find three integers in S such that the sum is closest to a given ...

  4. 稳定排序(sort+结构体)

    #include<cstdio> #include<algorithm> #include<string.h> using namespace std; struc ...

  5. 【HIHOCODER 1049】 后序遍历

    描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具--一棵由小球和木棍连接起来的二叉树! 小Ho对这棵二叉树爱不释手,于是给它的每一个节 ...

  6. python操作剪贴板错误提示:pywintypes.error: (1418, 'GetClipboardData',线程没有打开的剪贴板)

    问题现象:通过打断点,一步步调试可以正常复制和粘贴剪贴板数据.但是直接运行会报错pywintypes.error: (1418, 'GetClipboardData',线程没有打开的剪贴板) 问题原因 ...

  7. BNU 13174 Substring Frequency

    3C. Substring Frequency Time Limit: 1000ms Memory Limit: 32768KB 64-bit integer IO format: %lld      ...

  8. POJ 1379 (随机算法)模拟退火

    题目大意: 给定一堆点,找到一个点的位置使这个点到所有点中的最小距离最大 这里数据范围很小,精度要求也不高,我们这里可以利用模拟退火的方法,随机找到下一个点,如果下一个点比当前点优秀就更新当前点 参考 ...

  9. 【尺取】HDU String

    http://acm.hdu.edu.cn/showproblem.php?pid=5672 [题意] 给定一个小写英语字母组成的字符串,求这个字符串一共包含多少个至少有m个不同字母的连续子序列 [思 ...

  10. 【POJ3311】Hie with the Pie(状压DP,最短路)

    题意: 思路:状压DP入门题 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...