Hibernate 之 Persistence
分享自: 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
- package com.tgb.hibernate;
- import java.util.Date;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.cfg.Configuration;
- /**
- * 客户端程序
- * @author jnqqls
- * @group TGB
- * @version 2.0
- * @datetime 2012-12-9 22:08:23
- * @comments
- */
- public class Client {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 读取hibernate.cfg.xml文件
- Configuration cfg = new Configuration().configure();
- // 建立SessionFactory,对应一个数据库的镜像.
- SessionFactory factory = cfg.buildSessionFactory();
- // 获得session
- Session session = null;
- try {
- // 工厂创建session,并获得.
- session = factory.openSession();
- // 手动开启事务
- session.beginTransaction();
- // 创建User实体
- //--------------------从这里开始user对象处于Transient状态---------------
- User user = new User();
- user.setName("jnqqls");
- user.setPassword("jnqqls");
- user.setCreateTime(new Date());
- user.setExpireTime(new Date());
- // 保存user对象
- //--------------从这里开始user对象处于Persistent状态--------------
- /*Persistent状态的对象,当对象的属性发生改变的时候,
- hibernate在清理缓存(脏数据)的时候会和数据库同步
- */
- session.save(user);
- // 提交事务
- session.getTransaction().commit();
- } catch (Exception e) {
- // 这里只是简单打印一下堆栈,用于测试
- e.printStackTrace();
- //事务回滚.
- session.getTransaction().rollback();
- } finally {
- // session是否为null
- if (session != null) {
- // session是否打开
- if (session.isOpen()) {
- // 关闭session
- session.close();
- }
- }
- }
- //-------------------此时user对象处于Detacched状态-------------------
- }
接下来对Hibernate的持久化状态进行一个简单总结.
|
是否被Session管理 |
是否在数据库有记录 |
|
|
Transeint |
否 |
否 |
|
Persistent |
是 |
是 |
|
Detached |
否 |
是 |
理解持久化的概念对我们学习Hibernate非常有用.持久化概念是Hibernate核心概念之一,会对我们随后的Hibernate Mapping 和Hibernate
Cache都有帮助.
Hibernate 之 Persistence的更多相关文章
- hibernate之persistence错误
错误码: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityM ...
- 用hibernate tools生成对应的sql应用代码
参考资料: eclipse在线配置hibernate tools http://jingyan.baidu.com/article/db55b609959d154ba20a2f5d.html [图]H ...
- Hibernate 基础配置及常用功能(三)
本章重点讲述Hibernate对象的三种状态以及如何配置二级缓存 有关Hibernate的三种状态如何相互转换网上都能查到,官方文档描述的也比较详细.这里主要是针对几个重点方法做代码演示. 一.状态转 ...
- Hibernate项目用Maven创建(转)
本文将用Maven3.Hibernate3.6.Oracle10g整合,作为例子. 环境清单: 1.Maven3.0.5 2.Hibernate3.6.5 Final 3.JDK1.7.0.11 4. ...
- hibernate下载包中配置文件路径
路径:hibernate-release-5.0.2.Final\project\hibernate-ehcache\src\test\resources\hibernate-config 文件:hi ...
- Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一)
相关的maven的 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- Maven3路程(五)用Maven创建Hibernate项目
本文将用Maven3.Hibernate3.6.Oracle10g整合,作为例子. 环境清单: 1.Maven3.0.5 2.Hibernate3.6.5 Final 3.JDK1.7.0.11 4. ...
- JPA 2.1实例(hibernate 实现)
1.环境准备 1)java se 7 2)maven 3 3)mysql database 2.创建数据库和表结构 首先创建数据库.创建数据库脚本如下: create database jpa; 创建 ...
- Hibernate 映射字段问题[ImprovedNamingStrategy]
Hibernate 使用JPA 对于映射有3种规则能够配置:DefaultNamingStrategy,ImprovedNamingStrategy,EJB3NamingStrategy 这里仅仅说I ...
随机推荐
- HTML5增加与改良的input元素
h5中form表单中input新增的属性值 在HTML5中增加了许多新的标签和功能属性,今天我们来看一个Form表单在HTML5中新的使用方法.那么在HTML5中新加入的这个功能与之前咱们使用的功能区 ...
- day23 01 类的命名空间
day23 01 类的命名空间 一.初识面向对象复习 定义类: class 函数:方法 动态属性 变量:类属性 静态属性 过程: (1)_init_方法:初始化:def _init_(self,参数 ...
- Python3--中括号"[]"与冒号":"在列表中的作用
先来定义两个列表: liststr = ["helloworld","hahahh","123456"] listnum = [1,2,3, ...
- pytest以类形式的测试用例
from __future__ import print_function#pytest以类形式的测试用例class TestClass: @classmethod def setup_class(c ...
- Task(TPL)简单的实现Winform(WPF)异步
很多时候,我们要实现Winform异步操作,你可以用传统的方法,但个人感觉代码不好理解,而且使用真有点不舒服.也可以用Task来实现,Task(.net4.0新添加的对象)其实就是对线程池线程的一个封 ...
- 洛谷 P3800 Power收集
题目背景 据说在红雾异变时,博丽灵梦单身前往红魔馆,用十分强硬的手段将事件解决了. 然而当时灵梦在Power达到MAX之前,不具有“上线收点”的能力,所以她想要知道她能收集多少P点,然而这个问题她答不 ...
- [POJ1797] Heavy Transportation(最大生成树 || 最短路变形)
传送门 1.最大生成树 可以求出最大生成树,其中权值最小的边即为答案. 2.最短路 只需改变spfa里面的松弛操作就可以求出答案. ——代码 #include <queue> #inclu ...
- 最近切的两题SCC的tarjan POJ1236 POJ2186
两题都是水题,1236第一问求缩点后入度为0的点数,第二问即至少添加多少条边使全图强连通,属于经典做法,具体可以看白书 POJ2186即求缩点后出度为0的那个唯一的点所包含的点数(即SCC里有多少点) ...
- 微服务架构的基础框架选择:Spring Cloud还是Dubbo?
本文转自:http://mt.sohu.com/20160803/n462486707.shtml 最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论 微服务架构 .近期也看到 ...
- P2820 局域网 洛谷
https://www.luogu.org/problem/show?pid=2820 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成 ...
