hibernate 复合主键 根据主键删除_6道常见的 Hibernate 面试题
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建立)
hibernate 复合主键 根据主键删除_6道常见的 Hibernate 面试题相关推荐
- hibernate 复合主键 根据主键删除_Python 之 MySql“未解之谜”11--主键 id 那些事
主键 id 用自增和 uuid 有什么区别? ● uuid 有 16 个字节,比 int(4 byte)和 bigint(8 byte)占用更多存储空间 有大量数据的时候 uuid 主键不会像自增主键 ...
- Hibernate保存数据自动生成主键出现奇怪异常Duplicate entry '0' for key 1
今天在写一块程序的时候,出现了一个异常信息,捣鼓了一上午,终于找到了异常原因--不仅仅是简单的主键冲突问题 测试数据库:MySQL 异常信息如下: org.hibernate.exception.Co ...
- 超键、候选键、主键、外键、联合主键、复合主键
首先看看各种键的定义: 超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键(只要有一个键唯一,再随便组其他的键,合起来叫主键) 候选键(candidatekey):不含有多余 ...
- sql 复合主键 联合主键_学习SQL:主键
sql 复合主键 联合主键 If you've already worked with databases, then you could hardly miss the term – Primary ...
- sql添加删除主键、外键
在创建表时设立主键.外键 create table student(sid integer,sname nvarchar2(64),teacherId integer,primary key(sid) ...
- 主码索引、聚集索引、非主码索引(辅助索引)、唯一索引、外键索引、复合索引、非主码索引、聚集主码(聚集索引)、单列索引、多列索引、普通索引等...
强烈建议看了第一个参考文献再来看这个篇博文,因为此处不准备讲底层数据结构的实现. 索引:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构.其 ...
- 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量
文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...
- MSSQL如何在没有主键的表中删除重复数据
MSSQL如何在没有主键的表中删除重复数据 原文:MSSQL如何在没有主键的表中删除重复数据 为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create datab ...
- oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解
hibernate配合oracle自动生成主键策略有两种方法: A)设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence,此种做法就如同MS-SQL, ...
最新文章
- 使用CoreOS及Docker搭建简单的SaaS云平台
- MyEclipse部署Tomcat服务器
- JavaFX 中的像素、分辨率与缩放比
- 工厂模式 + 反射 ?= 灵活多变的数据库
- Vue基础之Vue条件渲染
- pandas取某一索引的数据
- 关于String,StringBuffer和StringBuilder之间的区别和联系
- WebView的详细讲解
- centos php管理面板,CentOS Web Panle控制面板PHP Version Switcher
- [图:知识竞赛题库PPT制作] 为上海棒约翰餐饮管理有限公司定制的的知识竞赛题目及展示界面-PPT格式-双屏展示。
- Javascript视频教程全集,基础入门学习-动力节点
- minecraftjava版光追_我的世界:网易版终于更新狐狸生物?Java版光追技术已开始测试...
- RTF(rich textformat)富文本格式
- 听课记录范文计算机基础,【教师听课记录范文】_听课记录范文三篇
- android依赖本地工程排除,Android Gradle依赖项排除(Android Gradle dependency exclude)
- Sam Altman 山姆奥特曼:如何成功 ?How To Be Successful
- AH8652,AH8100,非隔离5V,供电替代阻容降压方案
- 查找计算机硬件和软件的翻译工具,计算机软件和硬件,PC computer software and hardware,音标,读音,翻译,英文例句,英语词典...
- 【转】下一代密码模块安全标准探讨
- Windows留后门--教程(一)——Windows系统隐藏账户
热门文章
- 感知机数据算法的对偶形式
- Golang undefined: strings.ReplaceAll解决
- RHEL6 64bit下更改YUM配置。yum this system is not registered with rhn的解决办法
- 云炬VB开发笔记 2可视化编程基础
- 第01课:深度学习概述
- oracle中导出的sql文件转入mysql中的工作记录
- [scala-spark]10. RDD转换操作
- VTK修炼之道40:频域处理_快速傅里叶变换及其反变换1
- 鼠标取点——ginput()和getpts()详解
- linux文件-access函数