关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存。

Hibernate的持久化类有三种状态:

1、Transient瞬时态:持久化对象没有唯一标识OID,没有纳入Session的管理。

  2、Persistent持久态:持久化对象有唯一标识OID,已经纳入到Session的管理,另外,持久化具有自动更新数据库的特点

  3、Detached脱管态:持久化对象有唯一标识OID,没有纳入到Session管理。

下面给出一段代码来区分这三种状态:

 // 区分持久化对象的三种状态:
public void demo1(){
// 1.创建Session
Session session = HibernateUtils.openSession();
// 2.开启事务
Transaction tx = session.beginTransaction(); // 向数据库中保存一本图书:
Book book = new Book(); // 瞬时态:没有唯一标识OID,没有与session关联.
book.setName("Hiernate开发");
book.setAuthor("孙XX");
book.setPrice(65d); session.save(book); // 持久态:有唯一标识OID,与session关联. // 3.事务提交
tx.commit();
// 4.释放资源
session.close(); book.setName("Struts2开发"); // 脱管态:有唯一的标识,没有与session关联.
}

另外,三种状态对象的转换如下:

瞬时态:
获得:
Book book = new Book(); 瞬时--->持久
* save(book);
* save()/saveOrUpdate();
瞬时--->脱管
* book.setId(1);
持久态:
获得:
Book book = (Book)session.get(Book.class,1);
* get()/load()/find()/iterate(); 持久--->瞬时:
* delete(book);
* 特殊状态:删除态.(被删除的对象,不建议去使用.) 持久--->脱管:
* session.close();
* close()/clear()/evict();
脱管态:
获得:
Book book = new Book();
book.setId(1); 脱管--->持久:
* session.update();
* update()/saveOrUpdate()/lock() 脱管--->瞬时:
* book.setId(null);

上面我们提到了持久化对象具有自动更新数据库的特点,其根本原因是依赖于hibernate的一级缓存。

在hibernate中,分成两个基本的缓存:

一级缓存和二级缓存,其实还有个缓存,名为查询缓存,也有书籍把其命名为三级缓存,下面我就先介绍一级缓存。

一级缓存:Session级别的缓存,一级缓存与session的生命周期一致,是自带的,不可卸载。

至于缓存的好处,无非提高效率。

演示:

 // 证明一级缓存的存在
public void demo3(){
// 1.创建Session
Session session = HibernateUtils.openSession();
// 2.开启事务
Transaction tx = session.beginTransaction(); // save方法可以向一级缓存中存放数据的.
/*Book book = new Book();
book.setName("JQuery开发");
book.setAuthor("张XX");
book.setPrice(45d); Integer id = (Integer) session.save(book); Book book2 = (Book) session.get(Book.class, id); System.out.println(book2);*/ // 分别用get执行两次查询.
Book book1 = (Book) session.get(Book.class, 1);// 马上发生SQL去查询
System.out.println(book1); Book book2 = (Book) session.get(Book.class, 1);// 不发生SQL,因为使用一级缓存的数据
System.out.println(book2); // 3.提交事务
tx.commit();
// 4.关闭资源
session.close();

当session加载了customer对象后,会为customer对象的值类型的属性复制一份快照,也就是在一级缓存中的快照区copy一份相同的数据。

当刷出缓存时,通过比较对象的当前属性和快照,来判断对象的哪些属性发生了变化,如果数据一致,不更新,如果数据不一致,自动更新数据库。

在hibernate中,我们可以通过一些方法来管理一级缓存:

一级缓存是与session的生命周期相关的.session生命周期结束,一级缓存销毁了.

clear()            :清空一级缓存中所有的对象.
evict(Object obj)  :清空一级缓存中某个对象.
flush()            :刷出缓存.
refresh(Object obj):将快照区的数据重新覆盖了一级缓存的数据.

另外,关于一级缓存的刷出时机

FlushMode:
* ALWAYS :每次查询的时候都会刷出.手动调用flush.事务提交的时候.
* AUTO :默认值.有些查询会刷出.手动调用flush.事务提交的时候.
* COMMIT :在事务提交的时候,手动调用flush的时候.
* MANUAL :只有在手动调用flush才会刷出.

严格程度:MANUAL > COMMIT > AUTO > ALWAYS

最新文章

  1. .net core 学习笔记(4)-ViewComponent
  2. Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】
  3. mac 下 svn ignore 操作
  4. JVM——类的加载过程
  5. Linux C 程序 字符串函数(12)
  6. WINDOWS下简单操作SQLITE3
  7. ECMAScript6-let和const命令
  8. 设置ARC有效或者无效
  9. 【转载】MySQL事务以及SELECT ... FOR UPDATE的使用
  10. npm包管理器相关知识
  11. Nancy 返回值详解
  12. Servlet的5种方式实现表单提交
  13. sql server外网复制+非默认端口
  14. webpack分离打包css和less
  15. JDBC 编程步骤
  16. 学习BOS物流项目第九天
  17. Redis命令汇总
  18. Android - "已安装了存在签名冲突的同名数据包",解决方法!
  19. excel 使用技巧
  20. Python数据分析(三)pandas resample 重采样

热门文章

  1. Django学习系列16:处理完POST请求后重定向
  2. 如何优雅高效的写博客(Sublime + Markdown + Evernote)
  3. 【Linux学习二】Linux文件系统
  4. Pandas的常见使用方法操作
  5. http学习--常用请求方法和响应状态码
  6. Array数组对象方法
  7. 阿里云服务器(Linux)上打开新端口
  8. CSS 按钮
  9. Eclipse中文件结构的树形显示问题
  10. ReactJS 结合 antd-mobile 开发 h5 应用基本配置