Hiberante知识点梳理

  1. Hibernate简介
    • Hibernat是一个ORM(关系映射)框架,对JDBC访问数据库的操作进行了简化,并且将数据库表中的字段和关系映射为对象,简化了对数据库的操作。

2. 使用方法

  • 读取并解析配置文件
  • 读取并解析映射信息,创建SessionFactory
  • 打开Sesssion
  • 创建事务Transation
  • 持久化操作
  • 提交事务
  • 关闭Session
  • 关闭SesstionFactory

3. 为什么要用Hibernate

  • 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
  • hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
  • hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。

4. 延迟加载

  • 有类的延迟加载和集合的延迟加载,hibernate3添加了属性,查询对象的时候不是立即发出sql语句而是在真正用到对象的时候才发出sql语句
  • lazy=false 管理是否开启懒加载
  • 对象是用load方法,而集合默认为懒加载

5. session

  • session是维护数据库连接并且执行查询,更新,删除操作,Session不是线程安全的

6. update和saveOrUpdate的区别

  • update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。
  • saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会 更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。

7. 一级缓存

  • 一级缓存为session内的缓存 生命周期和session声明周期相同,

8. 二级缓存

  • 二级缓存是在SessionFactory这个级别维护的缓存,它能够通过节省几番数据库调用往返来提高性能。
  • 放在二级缓存中的数据应该为不经常改变,保密性底的数据
  • Hibernate框架并没有实现二级缓存,是借助于第三方插件来实现的(ehcache)

9. 查询缓存

  • 查询缓存实际上保存的是sql查询的结果,这样再进行相同的sql查询就可以之间从缓存中拿到结果了。
  • 生命周期: 数据放到查询缓存中,将会一直存在,直到缓存中的数据被更改,则缓存中的数据消失
  • 根据时间戳来判断数据状态
  • 默认关闭,需要配置文件开启,还需要用query.setCacheable(true);来启动

10. load和get

  • get查询时先查询一级缓存然后二级缓存然后数据数据库,直接返回实体对象,如果查询不到返回null
  • load如果一级缓存查询不到对象会返回一个代理对象,然后等到真正使用这个对象的时候才去查询二级和数据库。查询不到抛异常

11. hibernate的三种状态之间如何转换

  • 当对象由瞬时状态(Transient)一save()时,就变成了持久化状态;
  • Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了,这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。
  • 当游离状态(Detached)update()时,又变为了持久状态(Persistent)。
  • 当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient), 此时,数据库中没有与之对应的记录。

12. hibernate里面的sorted collection 和ordered collection有什么区别

  • sorted collection是在内存中通过Java比较器进行排序的
  • ordered collection是在数据库中通过order by进行排序的

13. persist和save的区别

  • persist不保证立即执行,可能要等到flush;persist不更新缓存;

14. cascade,即对住对象的更新怎么影响到子对象;

  • save-update: 级联保存(load以后如果子对象发生了更新,也会级联更新). 但它不会级联删除
  • delete: 级联删除, 但不具备级联保存和更新
  • all-delete-orphan: 在解除父子关系时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
  • all: 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
  • delete-orphan:删除所有和当前对象解除关联关系的对象

15. fetch 抓取策略,在配置文件的Set标签配置

  • join : 左外链接 而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
  • select : 默认select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;
  • subselece : 子查询

16. 实现关系

  • many-to-one 对象
  • one-to-many set
  • many-to-may Set

17. POJO的要求

  • 必须有一个无参的构造方法
  • 不能为final
  • 属性要为Private,并且提供get/set

18. inverse

  • 在多对多关系中默认为flase 表示为两端都在维护关系
  • 应该改为一端维护关系而不是两端。 inverse=true 代表配置这个的一方放弃了维护关系的权利

19. 数据库中查询速度慢

  • 建索引
  • 减少表之间的关联
  • 优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面
  • 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

20. SessionFactory

  • SessionFactory就是一个用于创建Hibernate的Session对象的工厂。SessionFactory通常是在应用启动时创建好的,应用程序中的代码用它来获得Session对象。作为一个单个的数据存储,它也是线程安全的,所以多个线程可同时使用同一个SessionFactory,hibernate中的配置文件,映射文件,持久化类的信息都保存在SessionFactory。
  • 一个SessionFactory 在启动的时候只能建立一次

21. 五个核心接口

  • Configuration 接口:配置Hibernate,根据其启动hibernate,创建
  • SessionFactory 接口:初始化Hibernate,充当数据存储源的代理,创建
  • Session 接口:负责保存、更新、删除、加载和查询对象,是线程不安全的,
  • Transaction 接口:管理事务;
  • Query 和Criteria 接口:执行数据库的查询。

22. Hiberante和Mybatis的区别

  • Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端架构

java调用js代码和js调用java类和方法示例

NodeJS带来的原生异步并发与事件驱动编程模型得到认可,但是因为其单线程缘故,不能简单方便地从事密集计算,而java优势是多线程并发,Java 8又引入了La...

661
来自专栏程序员互动联盟

【专业技术】Linux设备驱动第六篇:高级字符驱动操作之iotcl

在之前我们介绍了如何实现一个简单的字符设备驱动,并介绍了简单的open,close,read,write等驱动提供的基本功能。但是一个真正的设备驱动往往提供了比...

3298
来自专栏Java开发者杂谈

Spring @Transactional踩坑记

@Transactional踩坑记 总述 ​ Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@...

4407
来自专栏GreenLeaves

oracle10g获取Date类型字段无时分秒解决办法!

一般的数据库中,DATE字段仅仅表示日期,不包括日期信息,而Oracle数据库中的DATE数据类型是包括日期、时间的,对于不同的Oracle jdbc驱动版本,...

1835
来自专栏程序猿DD

基于Consul的分布式锁实现

我们在构建分布式系统的时候,经常需要控制对共享资源的互斥访问。这个时候我们就涉及到分布式锁(也称为全局锁)的实现,基于目前的各种工具,我们已经有了大量的实现方式...

2535
来自专栏FD的专栏

一步步理解python的异步IO

看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下。 因为是初学者,在理解上有很多不到...

972
来自专栏机器学习从入门到成神

2017年阿里内推一面面经(不断更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

871
来自专栏MasiMaro 的技术博文

OLEDB存取BLOB型数据

现代数据库系统除了支持一些标准的通用数据类型以外,大多数还支持一种称之为BLOB型的数据。 BLOB全称为big large object bytes, 大二...

923
来自专栏java学习

Hibernate学习笔记2

定义hbm.xml映射文件和pojo类时都需要定义主键,Hibernate中定义的主键类型包括:自然主键和代理主键:

864
来自专栏分布式系统进阶

ReplicaManager源码解析1-消息同步线程管理

基本上就是作三件事: 构造FetchRequest, 同步发送FetchRequest并接收FetchResponse, 处理FetchResponse, 这三...

732

扫码关注云+社区