专栏首页Java 技术分享Hibernate Session总结

Hibernate Session总结

现在我们可以在 IDEA 下新建一个 Hibernate 项目,接着上次内容这次主要总结一下 Hibernate 的 Session,及其核心方法。


Session

概述

  • Session 接口是 Hibernate 向应用程序提供的操纵数据库的主要接口,提供了基本的保存、更新、删除和加载 java 对象的方法
  • Session 具有一个缓存,位于缓存中的对象称为持久化对象,和数据库中的相关记录对应
  • Hibernate 将对象分为 4 种状态,持久化状态,临时状态,游离状态,删除状态,Session 特定的方法可以使对象从一个状态到另一个状态。

Session 缓存

  • Session 接口实现中包含一系列 java 集合,这些 java 集合构成了 Session 缓存,只要 Session 实例没有结束生命周期,且没有清理缓存,则存放在他缓存中的对象也不会结束生命周期
  • Session 缓存可以减少 Hibernate 访问数据库的频率

操作 Session 缓存

  • reflush(): 会强制发送sql查询(select)语句,使缓存中的数据和数据库中的数据保持一致,数据由数据库到缓存
  • flush(): 会强制发送sql更新(update)语句,使数据库中的数据和缓存中的数据保持一致,数据由缓存到数据库
  • 当程序执行 Transaction 的 commit() 方法时,该方法会先 flush(),然后再提交事务

持久化对象的状态

  • 临时对象
    • ID 通常为 null
    • 不处于 Session 的缓存中
    • 在数据库中没有对应的记录
  • 持久化对象
    • ID 不为 null
    • 位于 Session 缓存中
    • 持久化对象和数据库中相关记录对应
    • Session 在 flush 缓存时,会根据持久化对象的属性变化,来同步更新数据库
    • 同一个 Session 实例的缓存中,数据库表的每条记录对应唯一的持久化对象
  • 删除对象
    • 数据库中没有其 ID 对应的记录
    • 不再处于 Session 缓存中
    • 一般情况下应用程序不再使用该对象
  • 游离对象
    • ID 不为 null
    • 不再处于 Session 缓存中
    • 游离对象一般由持久化对象转换而来,因为数据库中可能会存在对应的对象

Session 方法

  • save() & persist()
    • save() 和 persist() 方法可以使得一个临时对象转变为持久化对象
    • 执行 save() 和 persist() 方法将会在 flush 缓存的时候执行一条 insert 语句
  • get() & load()
    • 都是从根据 id 从数据库中加载一个持久化对象,当数据库中没有对应 id 的对象,get() 方法返回 null,load() 方法抛出一个异常
    • load() 有延迟加载策略,即执行方法后返回一个代理对象,直到用到该对象的时候才会持久化,若关闭了 session,那么就会发生懒加载异常
  • update()
    • update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条update 语句.
    • 当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常
  • delete()
    • delete() 方法既可以删除一个游离对象,也可以删除一个持久化对象

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hibernate Session总结

    bgZyy
  • WEB 小案例 -- 网上书城(二)

    bgZyy
  • Servlet 学习笔记

    bgZyy
  • Hibernate Session总结

    bgZyy
  • Hibernate从入门到放弃(三)----持久化对象

    当对象刚创建,和Session没有发生任何关系时,当程序运行完成就立刻消失,被称为瞬时态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失...

    令仔很忙
  • 整理+学习《骆昊-Java面试题全集(下)》

    这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring MVC等,由于Struts 2已经是明日黄花,...

    黑泽君
  • webpack + express 实现文件精确缓存

    由于最近开发的个人博客(Vue + node)在使用过程中,发现网络加载有点慢,所以打算对它进行一次优化。本次优化的目标如下:

    谭光志
  • 性能设计 - 缓存

    基本上来说,在分布式系统中最耗性能的地方就是最后端的数据库了。一般来说,只要小心维护好,数据库四种操作(select、update、insert 和 delet...

    JAVA日知录
  • 大型服务端开发的反模式技巧

    1. 用线程池执行异步任务 ? 为了减少阻塞时间,加快响应速度,把无需返回结果的操作变成异步任务,用线程池来执行,这是提高性能的一种手段。 你可能要惊讶了,这么...

    李海彬
  • redis缓存

    缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询...

    挑战者

扫码关注云+社区

领取腾讯云代金券