hibernate总结

在持久化层,对象分为哪些状态?

  • 瞬时态(transistant):对象创建时,瞬时对象在内存孤立存在,携带信息的载体,不和数据库有任何关联,在hibernate里面,可以使用session的save()或saveOrUpdate()将瞬时态转为持久态
  • 持久态(Persistent):该对象在数据库已有对应的记录,并且拥有一个持久化标识,如果是使用hibernate的delete()方法,对应的持久态会变成瞬时态,因为此时他不和数据库有任何关联;当session执行close()或者clear()、evict(),持久态变成托管态,因为此时该对象已经不再hibernate持久层的管理之下
    • 与session实例关联
    • 在数据库有关联记录
  • 托管态(Detached):当session执行close()或者clear()、evict(),持久态变成托管态,因为此时该对象已经不再hibernate持久层的管理之下;可以通过update()、saveOrUpdate()等方法,转变成持久化对象
    • 本质上和瞬时对象相同,没有任何变量引用它时,JVM会在适当的时候进行回收
    • 比瞬时对象多了个数据库标识值

hibernate和JDBC

  • hibernate是基于JDBC的,它对JDBC访问数据库做了封装,大大的简化了数据访问层繁琐的重复性代码
  • 性能比较好,属于轻量级的框架,支持多种关系数据库,和多种映射关系

开发流程

  • 配置Configuration
  • 创建sessionFactory
  • 开启session
  • 开始事务
  • 操作数据库
  • 提交事务
  • 关闭session
  • 关闭sessionFactory

延迟加载

延迟加载是为了避免一些无谓的性能开销提出来的,所谓的延迟加载就是当真正需要数据的时候才执行数据加载的操作,在hibernate中提供了对实体对象和集合的延迟加载。

hibernate查询方式

HQL,SQL,Criteria

HIbernate如何处理事务

hibernate是对JDBC的轻量级对象封装,本身不具备transaction处理功能,hibernate的transaction是底层JDBC的封装或者是JTA transaction的封装,取决于hibernate.properties中的配置;默认是JDBC的transaction

hibernate的缓存机制

hibernate的一级缓存:session级别的缓存,在session接口的实现中包含一系列的java集合,这些java集合构成了session缓存;持久化对象也保存在一级缓存

  • 当使用session的save()时,持久化一个瞬时态对象,该对象被载入内存,即使以后不使用这个对象,缓存不清空时,该对象仍然处于生命周期;当使用load()和get()时,会先在缓存中查找,有则返回,无者加载。
  • session能够在某些时间点,按照缓存中的变化执行相应的sql语句,来同步数据库,这一过程称作flush
  • hibernate向session缓存放入数据时,会同时保存快照数据(数据库备份),当修改一级缓存,进行flush时,会对比缓存和快照,如果不一致,就会使用update更新
    一级缓存的操作:flush,clear,evict,reflush
    flush:将缓存变化同步到数据库
    clear:将缓存清空
    evict:清除一级缓存指定的对象
    refresh:重新查询数据库,更新快照和一级缓存

hibernate的二级缓存:sessionFactory级别的缓存,属于进程范围的缓存,分为两个部分:内置和外置

  • 内置:hibernate自带的,不可卸载,通常在hibernate初始化阶段,hibernate会把元数据和预定义的sql语句放到sessionFactory的缓存,内置缓存属于只读的
  • 外置:可配置的缓存插件,外置缓存中的数据是数据库数据的复制,,必须引入第三方插件才能使用

二级缓存的并发策略

  • transactionnal: 提供repeatable read事务隔离级别,缓存事务支持,发生异常的时候能够回滚
  • read-write:提供read commit事务隔离级别,更新缓存时会锁定缓存中的数据
  • non-read-write:会导致脏读
  • read-only:数据只读,不允许修改

二级缓存常用技术

  • EHCache
  • OSCache
  • SwarmCache
  • JBOSSCache

hibernate的三种检索策略

  • 立即检索:立即将查询对象查询出来加进缓存,并且将其关联对象也加载出来,这样做能够及时加载自身数据和关联对象数据,但是比较占内存和执行过多的select语句。
    • 对应用程序完全透明,不管处于持久态还是游离态,应用程序都可以方便的从一个对象导航到与他关联的对象
    • select语句太多,可能应用程序加载到不需要的对象而浪费内存
    • 立即检索lazy=true
  • 延时检索:在不涉及到连级操作单张表时,只适用 session 的 load 方法,只有在用到对象除 id 以外的属性时才会去加载对象;在涉及到关联类操作时,只有在用到关联对象的时候才会去加载
    • 由程序决定加载哪些内容,避免了大量无用的查询语句
    • 在session关闭后,就不能访问关联类的对象了,强行访问会发生懒加载异常
  • 左外连接检索:采用左外连接检索,能够使用SQL的外连接查询将关联对象加进缓存中
    • 使用了外连接,select语句数目少
    • 可能会加载应用程序不需要的对象进缓存,白白浪费内存,同时复杂的数据库表连接也会影响检索性能。

hibernate的inverse作用

inverse属性默认是false,就是说关系的两端都来维护关系。

  • 比如student和teacher表,是多对多的关系,用一个TeacherStudent维护
  • 如果student这边inverse= true,说明TeacherStudent维护由teacher表负责,当操作student表不会操作TeacherStudent;当teacher表操作时,会触发对TeacherStudent的操作;所以两边inverse都为true是错误的设置

JDBC/Hibernate/ibatis的区别

JDBC

  • 手写sql
  • delete,insert,update要一个个 将对象的值取出来放到sql语句中,不能直接传一个对象
  • select返回一个resultSet,需要从resultSet一行行遍历,然后遍历每一行的字段,取值封装成对象

HIbernate

  • 不写sql
  • delete,insert,update可以直接取对象
  • select直接返回对象

Ibatis

  • 手写sql
  • delete,insert,update可以直接取对象
  • select直接返回对象
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 五年级 郑士澎 今天中午上课前,我们几个去涮拖把,回去的时候都没有关水龙头,邵佳奇一个人就回去把所有的关水龙头都...
    语子梅阅读 377评论 0 1
  • 【幸福】 郭相麟 曾经期望着 幸福的毛毛细雨 滋润着心田 如甘甜的水 让灵魂的沙漠 发现生机盎然的绿洲...
    郭相麟阅读 106评论 0 0
  • 北冥有鱼,其名为鲲。鲲之大,不知其几千里也。 去年临的一幅图,,是大鱼所有海报里最喜欢的一幅。画了差不多一周的时间...
    橙几vt阅读 1,281评论 2 23