1、Hibernate的理解

Java的核心之一是面向对象设计,那么如何把数据库的数据封装成一个对象返回呢?如何把一个对象出局后保存到数据库呢?Java采用了jdbc来解决这个问题,但是数据量如何解决,也没有标准的模板来解决呢?这就是Hibernate的功能之一了。

Hibernate实现了Java对象与关系数据库记录的映射关系,简称ORM,像mybatis、jpa也是一种ORM框架。有了Hibernate,我们就不需要写jdbc代码了,直接调用hibernate的方法就可以了,比如save、get。对 JDBC 访问数据库的代码做了封装,简化了数据访问层繁琐的重复。

2、Hibernate运行过程和原理

简单运行过程如下:

配置Configuration 、产生SessionFactory、创建session对象、启动事务、完成CURD、提交事务、关闭session。

所以核心是:Configuration、SessionFactory、Session

1、hibernate启动的时候利用Configuration读取xml配置文件
2、通过配置文件创建SessionFactory对象,初始化hibernate基本信息
3、获取session然后调用CRUD方法进行数据操作,hibernate会把我们的数据进行三种状态的划分,然后根据状态进行管理我们的数据,对应的发送SQL进行数据操作
4、关闭session,如果有事务的情况下,需要手动获取事务并开启,然后事务结束后提交事务。
5、在提交事务的时候,去验证我们的快照里面的数据和缓存数据是否一致,如果不一致,发送SQL进行修改。

3、Hibernate的数据三种状态

Hibernate把他所管理的数据划分为三种状态 瞬时的(刚new出来的数据–内存有,数据库没有) 不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象.

持久的 (从数据查询的,或者刚保存到数据库,session没关闭的, 数据库有,内存也有) 处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。

当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下。

游离的 (数据库有,内存没有) 当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到session上时,并再次转变成持久对象。

在事务提交的时候,Hibernate去对比处于持久状态的数据是否发生改变,(快照区、一级缓存区),当我们会话结束前,对持久状态数据进行了修改的话,快照区的数据会跟着改变。当session提交事务的时候,如果发现快照区和一级缓存的数据不一致,就会发送SQL进行修改。

4、Hibernate的get方法和load方法的区别

1、get和load都是利用主键策略查询数据,
2、get默认不使用懒加载机制,load默认要使用懒加载机制,所谓的懒加载就是我们这个数据如果不使用,hibernate就不发送SQL到数据库查询数据。
3、当查询数据库不存在的数据的时候,get方法返回null,load方法抛出空指针异常,
原因是因为,load方法采用的动态代理的方式实现的,我们使用load方法的时候,Hibernate会创建一个该实体的代理对象,该代理只保存了该对象的ID,当我们访问该实体对象其他属性,Hibernate就发送SQL查询数据封装到代理对象,然后在利用代理对象返回给我们实际的数据。

5、Hibernate的缓存机制

hibernate分为2级缓存

一级缓存又叫session缓存,又叫事务级缓存,生命周期从事务开始到事务结束,一级缓存是hibernate自带的,暴力使用,当我们一创建session就已有这个缓存了。数据库就会自动往缓存存放,
二级缓存是hibernate提供的一组开放的接口方式实现的,都是通过整合第三方的缓存框架来实现的,二级缓存又叫sessionFactory的缓存,可以跨session访问。常用的EHcache、OScache,这个需要一些配置。

当我们每次 查询数据的时候,首先是到一级缓存查看是否存在该对象,如果有直接返回,如果没有就去二级缓存进行查看,如果有直接返回,如果没有在发送SQL到数据库查询数据,
当SQL发送查询回该数据的时候,hibernate会把该对象以主键为标记的形式存储到二级缓存和一级缓存,如果返回的是集合,会把集合打散然后以主键的形式存储到缓存。一级缓存和二级缓存只针对以ID查询的方式生效,get、load方法。

6、Hibernate有哪几种查询数据的方式

3种

  • hql、

  • 条件查询QBC(Query By Criteria)

  • 原生sql (通过createSQLQuery建立)

--end--

hibernate 复合主键 根据主键删除_6道常见的 Hibernate 面试题相关推荐

  1. hibernate 复合主键 根据主键删除_Python 之 MySql“未解之谜”11--主键 id 那些事

    主键 id 用自增和 uuid 有什么区别? ● uuid 有 16 个字节,比 int(4 byte)和 bigint(8 byte)占用更多存储空间 有大量数据的时候 uuid 主键不会像自增主键 ...

  2. Hibernate保存数据自动生成主键出现奇怪异常Duplicate entry '0' for key 1

    今天在写一块程序的时候,出现了一个异常信息,捣鼓了一上午,终于找到了异常原因--不仅仅是简单的主键冲突问题 测试数据库:MySQL 异常信息如下: org.hibernate.exception.Co ...

  3. 超键、候选键、主键、外键、联合主键、复合主键

    首先看看各种键的定义: 超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键(只要有一个键唯一,再随便组其他的键,合起来叫主键) 候选键(candidatekey):不含有多余 ...

  4. sql 复合主键 联合主键_学习SQL:主键

    sql 复合主键 联合主键 If you've already worked with databases, then you could hardly miss the term – Primary ...

  5. sql添加删除主键、外键

    在创建表时设立主键.外键 create table student(sid integer,sname nvarchar2(64),teacherId integer,primary key(sid) ...

  6. 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...

    强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...

  7. 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量

    文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...

  8. MSSQL如何在没有主键的表中删除重复数据

    MSSQL如何在没有主键的表中删除重复数据 原文:MSSQL如何在没有主键的表中删除重复数据 为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create datab ...

  9. oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解

    hibernate配合oracle自动生成主键策略有两种方法: A)设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL, ...

最新文章

  1. 使用CoreOS及Docker搭建简单的SaaS云平台
  2. MyEclipse部署Tomcat服务器
  3. JavaFX 中的像素、分辨率与缩放比
  4. 工厂模式 + 反射 ?= 灵活多变的数据库
  5. Vue基础之Vue条件渲染
  6. pandas取某一索引的数据
  7. 关于String,StringBuffer和StringBuilder之间的区别和联系
  8. WebView的详细讲解
  9. centos php管理面板,CentOS Web Panle控制面板PHP Version Switcher
  10. [图:知识竞赛题库PPT制作] 为上海棒约翰餐饮管理有限公司定制的的知识竞赛题目及展示界面-PPT格式-双屏展示。
  11. Javascript视频教程全集,基础入门学习-动力节点
  12. minecraftjava版光追_我的世界:网易版终于更新狐狸生物?Java版光追技术已开始测试...
  13. RTF(rich textformat)富文本格式
  14. 听课记录范文计算机基础,【教师听课记录范文】_听课记录范文三篇
  15. android依赖本地工程排除,Android Gradle依赖项排除(Android Gradle dependency exclude)
  16. Sam Altman 山姆奥特曼:如何成功 ?How To Be Successful
  17. AH8652,AH8100,非隔离5V,供电替代阻容降压方案
  18. 查找计算机硬件和软件的翻译工具,计算机软件和硬件,PC computer software and hardware,音标,读音,翻译,英文例句,英语词典...
  19. 【转】下一代密码模块安全标准探讨
  20. Windows留后门--教程(一)——Windows系统隐藏账户

热门文章

  1. 感知机数据算法的对偶形式
  2. Golang undefined: strings.ReplaceAll解决
  3. RHEL6 64bit下更改YUM配置。yum this system is not registered with rhn的解决办法
  4. 云炬VB开发笔记 2可视化编程基础
  5. 第01课:深度学习概述
  6. oracle中导出的sql文件转入mysql中的工作记录
  7. [scala-spark]10. RDD转换操作
  8. VTK修炼之道40:频域处理_快速傅里叶变换及其反变换1
  9. 鼠标取点——ginput()和getpts()详解
  10. linux文件-access函数