准备工作

在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程。本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移。

准备工作很重要,需要了解一些专业词汇,所谓专业词汇,意思大家都懂,只是在专业领域里起个专业的名称罢了。所以见到陌生东西时,应该尽可能的消除这种不必要的恐惧。

先了解这个专业词汇

何谓“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中。

持久化对象有三种状态

瞬时对象(Transient Objects):
1. 使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象,将由垃圾回收机制回收。 
2. 没有被session管理
3. 在数据库中没有与之匹配的记录

持久化对象(Persist Objects):
1. 纳入持久化管理器Session统一管理
2. 持久实例是在事务中进行操作的,当事务提交时(在清理缓存时),通过执行SQL语句把内存中的状态同步到数据库中。
3. 在数据库中有与之匹配的记录

离线对象(Detached Objects):
1. Session关闭之后,持久化对象就变为离线对象。离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
2. 在数据库中存在与之匹配的记录。

使用hibernate中的核心接口进行一些JDBC基本操作,来观察状态的转移

由transient状态到persist状态,完成insert操作
由detached状态到persist状态,完成update操作

public void testSave1(){
Session session = null;
User user = null; try {
session = HibernateUtils.getSession();
session.beginTransaction(); // transient状态
user = new User();
user.setName("zhangsan");
user.setPassword("123"); // persist状态
session.save(user); //Persistent状态的对象,如果对象的属性发生改变了
//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步
// 和数据库同步,体现在:当commit,开始清理缓存,使用快照比对的方式生成相应的sql语句,先insert,再update。
user.setName("lisi"); //可以显示的调用update方法,但此时为持久状态,调用update没有什么意义
// session.update(user); session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
} // detached状态
user.setName("wangwu");
try {
session = HibernateUtils.getSession();
session.beginTransaction(); //将detached状态的对象重新纳入session管理
//此时将变为persistent状态的对象
session.update(user); session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtils.closeSession(session);
} }

掌握了状态变化,当处于某个状态时就知道可以进行何种操作了。比如当处于Transient状态,我们只能进行save、update操作或者被回收。

Hibernate持久化是JPA规范的一种实现,还有其他实现方式,比如EJB的持久化,但大同小异,所以学好Hibernate的持久化,再学习其他的就更容易上手和理解了。

最新文章

  1. NodeJs 开发微信公众号(二)测试环境部署
  2. C++实现对lua访问的封装
  3. 2014 UESTC 暑前集训队内赛(2) 部分解题报告
  4. 9Types of Leader
  5. CodeForces 176B Word Cut dp
  6. Socket programming in C on Linux | tutorial
  7. 第三天关于网页sip的学习。平台win7 64位 freeSwitch jssip架构web网络电话
  8. NHibernate之旅(13):初探马上载入机制
  9. CSS选择器的组合选择器之后代选择器和子元素选择器
  10. hdu-2602&&POJ-3624---01背包裸题
  11. RAID磁盘阵列及CentOS7系统启动流程(week2_day3)--技术流ken
  12. [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence
  13. ubuntu 15 安装docker
  14. spring boot使用TestRestTemplate集成测试 RESTful 接口
  15. Java网络通信 TCP网络,ServerSocket类
  16. redis-server进程CPU百分百问题
  17. tomcat如何配置context的docBase
  18. U-Mail邮件群发触发器功能助力营销自动化
  19. python 第一课作用
  20. 【C#】利用反射构建实体

热门文章

  1. 移动小bug
  2. 真懂JavaScript吗
  3. 一个极简的守护进程Bash脚本
  4. UC编程:通过fwrite()和write()比较标准库函数和系统调用的速度
  5. linux下getrusage()
  6. 图文解说PhpStorm 7.0版本支持PHP 5.5
  7. 让.NET程序快速释放内存的办法
  8. BackgroundWorker组件使用总结
  9. Windows注册表的基本知识及应用
  10. readonly和const的区别