hibernate教程菜鸟教程

hibernate教程菜鸟教程内容大纲引题对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的规范,简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数

内容大纲

hibernate教程菜鸟教程

引题

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的规范,简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。

面向对象概念面向关系概念类表对象表的行(记录)属性表的列(字段)

ORM框架在前后端领域都能看到它的影子,比如Android的greenDAO、iOS的coreData、Node.js的mongoose,这里主要讲解Java中Hibernate我们比较容易忽略和重要的点。

save和get的执行流程

hibernate教程菜鸟教程

save和get

save:

  • 根据对象找到user类(user.getClass)和对应的映射文件User.hbm.xml,并解析出表名t_user
  • 使用内省机制操作user对象,获取其中的属性:id/name
  • 解析映射文件,找到属性对应的列名
  • 根据主键生成策略,如果是native,此时主键就不出现在SQL语句中,如当前的SQL语句为:insert into t_user(uname) values (?)其中?就对应user.getXxx()方法

get:

  • 根据对象找到user类(user.getClass)和对应的映射文件User.hbm.xml,并解析出表名t_user
  • 解析映射文件,找到<id>元素对应的列名uid,SQL就拼接成功了
  • 处理结果集,把一条数据封装成User对象
  • 创建User对象
  • 根据列名找到对应的属性名,调用user.setXxx()后返回对象

get和load方法的区别

先看这段简单的测试代码:

hibernate教程菜鸟教程

  • get会立即发送select语句,load不会立刻发送,当使用到该对象的非OID属性时才会发送,延迟加载
  • load方法返回的对象永远不为null,即使在数据库中不存在,所以不能使用if-null的方式来判断,而get可以为null,因为load执行的时候没有发送select语句,所以他不知道数据库中有没有对应数据,所以索性返回一个不为null的对象,如果存在,则再把数据设置到对象中去,如果不存在,使用该对象时报错
  • load方法会创建出代理对象,但是代理对象必须在session关闭之前创建出来,否则会报hibernate中最常见的错误,no session,解决办法为Hibernate.initialize(代理对象)

持久化对象的生命周期

为什么需要关注持久化对象的生命周期?那我们来回忆使用Hibernate中是否遇到的三个问题:

  • 问题一:主键生成策略不同,save操作时发生INSERT语句的时机不同?
  • native:在执行save方法的时候发送INSERT SQL
  • increment:在提交事务的时候,才发送INSERT SQL
  • 问题二:删除对象的时候,没有立刻发生DELETE语句,而是在提交事务的时候发送的。
  • 问题三:为什么在事务环境下,通过get方法得到的对象,只要修改了属性值,会发生UPDATE语句。

那么SQL的执行时机和什么有关系呢?和对象的状态有关系。那持久化对象的状态有哪一些?怎么划分的?

划分的规则::

  • 当前对象是否有OID(该对象在表中对应有一个id值)
  • 对象是否被session所管理(对象是否在一级缓存中)

状态描述特点临时状态/瞬时态(transient)刚刚用new语句创建,没有被持久化,不处于session中没有oid,不在session当中持久化状态(persistent)已经被持久化,加入到session的缓存中有oid,在session当中游离状态(detached)/脱管态已经被持久化,但不处于session中有oid,不在session当中删除状态(removed)对象有关联的ID,并且在session管理下,但是已经计划被删除有oid,在session当中,最终的效果是被删除.

hibernate教程菜鸟教程

持久化对象的状态

对象状态的总结

session中的方法仅仅只是改变对象的状态,不负责发送SQL/默认情况下事务提交的时候发送SQL,那么之前是三个问题就可以迎刃而解了。

  • 问题一解答:save方法仅仅是把临时状态的对象转换为持久化状态,本身不负责发送SQL。临时状态的对象没有OID,调用save方法之后,变成持久化状态,就必须有OID。 * native:表示数据库主键的自增长,只有发送SQL,才能获取主键,从而获取OID
  • increment:先发送SELECT语句查询id(拥有了OID),不需要发送increment来获取OID
  • 问题二解答:delete方法仅仅是改变对象的状态,本身不负责发送SQL。因此按照默认的方式,提交事务的时候发送SQL
  • 问题三解答:通过get查询操作得到的对象处于持久化状态(有OID,存在于一级缓存中)。此时,修改了非IOD的属性值,发现一级缓存中的数据和快照区域的数据不同(脏数据),Hibernate就会做比较(一级缓存和快照区),发现不同,就发送UPDATE语句,做数据同步。session的flush方法,负责把一级缓存中的脏数据同步到数据库中去

二级缓存

要了解二级缓存,我们就必须知道一级缓存是什么。介绍一级缓存之前,我们先回顾一下Session。

session

  • session对象,通过sessionFactory对象创建而来,包含了connection对象,封装了很多操作方法
  • session不是线程安全的(使用局部变量),所以,session的最大生命周期:一个线程,在web应用当中,一个session的最大生命周期:request
  • session中有一个缓存,称为一级缓存。存放当前工作单元加载的对象。在一个session的生命周期之内,连续拿相同类型,相同ID的对象,只需要发送一次SQL

hibernate教程菜鸟教程

原理如图:

hibernate教程菜鸟教程

一级缓存

虽然一级缓存可以提高性能,但是由于session的作用域有限,因此,提高的性能也是非常有限的,所以这就引出了二级缓存的概念:

二级缓存

  • 在整个应用中,有且只需要一个sessionFactory对象即可
  • 生命周期为整个应用的缓存(二级缓存是sessionFactory上的缓存,能提供整个应用中所有的session使用)
  • 所有的get,load方法,总是先查一级缓存,再查二级缓存,如果都没有,在去数据库里面查询

若想了解Hibernate和Mybatis的缓存对比可以戳这里《Hibernate和Mybaitis缓存》(
http://www.jianshu.com/p/fe4d82c8c97c)

事务并发问题

事务并发时,会产生两类丢失更新问题,如图:

  • 第一类丢失更新:A事务撤销时,把已经提交的B事务的更新数据覆盖了。

hibernate教程菜鸟教程

第一类丢失更新问题

  • 第二类丢失更新:A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失。

hibernate教程菜鸟教程

第二类丢失更新问题

然而解决的办法有两个,一个称之为悲观锁,一个称之为乐观锁。

悲观锁(Pessimistic Lock):悲观地认为每次自己去拿数据的时候别人会修改数据,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。底层采用的就是SELECT ….. FOR UPDATE

hibernate教程菜鸟教程

hibernate教程菜鸟教程

悲观锁

乐观锁(Optimistic Lock):乐观地认为每次去拿数据的时候别人不会修改数据,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

hibernate教程菜鸟教程

乐观锁

在Hibernate中使用乐观锁,推荐使用version方式:

hibernate教程菜鸟教程

激活谷谷主为您准备了激活教程,为节约您的时间请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/15261.html

(0)
上一篇 2024年 5月 18日
下一篇 2024年 5月 18日

相关推荐

  • 7zip压缩后在哪_7zip压缩并邮寄会到哪里去

    7zip压缩后在哪_7zip压缩并邮寄会到哪里去有哪些关于外国铁路、火车的冷知识?有一个类似的问题,大家答的都很精彩,但大部分都是中国的。这里再开一个楼,专说外国的冷知识。前言感谢大家的热烈支持,截至本文Chapter 2首次发表时,Chapter 1已经获得了111赞

    2024年 5月 9日
  • 163邮箱登录网页版_163邮箱登录网页版入口

    163邮箱登录网页版_163邮箱登录网页版入口163邮箱网页版注册登录,简单快捷对于电子邮箱使用网页版及客户端各有所爱,个人更倾向使用网页端,有些邮箱服务商把网页端做的极为好用,功能也非常强大。下面分享下网页端的登录使用教程01-通过网页端搜索,按照图示,找到163net邮箱官网02-进入官网,以下为按照163

    2024年 5月 15日
  • vs2019快捷命令键

    vs2019快捷命令键ffmpeg 简介FFmpeg 是一款免费的、开源的跨平台音视频处理工具,旨在提供高质量、高速度的多媒体处理功能,FFmpeg 设计以流式处理音视频。FFmpeg 目前已成为业界公认的最强大、最全面的音视频处理工具之一,得到了广泛的应用。绝大多数的音视频相关应用和工

    激活谷笔记 2024年 5月 18日
  • visio怎么读_visio中文叫什么

    visio怎么读_visio中文叫什么visio是什么意思,visio怎么读?Visio是什么意思,Visio怎么读?Visio是微软公司推出的一款流程图绘制软件,它主要用于图表绘制、流程图制作、组织结构图绘制等。Visio的中文意思是“

    激活谷笔记 2024年 5月 5日
  • 如何用anaconda创建虚拟环境_anaconda虚拟环境迁移至别的电脑

    如何用anaconda创建虚拟环境_anaconda虚拟环境迁移至别的电脑【保姆级教程】Anaconda环境迁移:直接将之前搭建好的环境从一个机子迁移到另一个机子Anaconda环境迁移 前言1. (从旧电脑)复制环境2. (在新电

    2024年 5月 17日
  • 7-zip怎么解压软件_7zip解压软件

    7-zip怎么解压软件_7zip解压软件7-zip压缩和解压文件方法教程7-zip如何压缩文件?1.下载安装7-zip,在需要压缩的文件或文件夹上右键,找到“7-zip”选项2.把鼠标放在上面,打开二级菜单,点击添加到压缩包。3.这里是详细设置,设置完点击“确定”。4.开始压缩。7-zi

    2024年 5月 11日
  • pci设备找不到驱动程序_pci设备找不到驱动程序win7

    pci设备找不到驱动程序_pci设备找不到驱动程序win7Win7装机时PCI简易通讯控制器叹号处理装Win7时设备管理器:PCI串行端口 PCI简易通讯控制器叹号,如何解决呢?(两个驱动更新方法一样)首先,右键点击更新驱动程序然后,选择浏览计算机 以查找驱动软件;这个地方需要注意啦,不用选择路径,直接点击下面的从计算机的设备驱动列表中选择找到系统设备这一

    2024年 5月 24日
  • linux如何安装docker

    linux如何安装docker我使用的操作系统是:Linux(阿里云操作系统AliyunLinux,CentOS)安装前的准备工作确认操作系统内核版本是否高于3.10(目前大家使用的较新的发行版都可以满足)[root@aliecs ~]# uname

    激活谷笔记 2024年 5月 19日
  • 分区表类型选mbr还是guid_win10分区表类型选mbr还是guid

    分区表类型选mbr还是guid_win10分区表类型选mbr还是guid装系统/重装系统/基础信息篇1-硬盘分区类型MBR和GUID该怎么选说到重装,极大多数的用户会遇到一个问题:进入PE后终于排除万难装好系统,重启后,猛然遇到带有boot提示的黑屏,像6月的暴风雨一样,说来就来。我们准备

    2024年 5月 29日
  • 线程同步的方法和优缺点怎么写_线程同步的方法和优缺点怎么写的

    线程同步的方法和优缺点怎么写_线程同步的方法和优缺点怎么写的15、线程同步方式有哪些?优缺点?进程中线程同步的四种常用方式:一、 临界区(CCriticalSection)当多个线程访问一个独占性共享资源时,可以使用临界区对象。拥有临界区的线程可

    激活谷笔记 2024年 5月 31日
  • 二阶低通滤波电路截止频率_二阶低通滤波电路截止频率计算

    二阶低通滤波电路截止频率_二阶低通滤波电路截止频率计算二阶有源带通滤波器设计二阶有源带通滤波器设计1、背景对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。假设需要处理一个20mV的正弦信号,该信

    2024年 5月 23日
  • win10系统软键盘快捷键_w10键盘快捷键在哪里设置

    win10系统软键盘快捷键_w10键盘快捷键在哪里设置电脑快捷键怎么设置 win10电脑快捷键设置方法【详解】在win10系统中,大家应该多多少少都接触到过一些快捷键,往往都是需要和如Ctrl键、Shift键、Alt键等等配合使用的,这些快捷键可以让我们的工作事半功倍,那么如果想要进行电脑快捷键的修改设置要怎么设置呢?设置成自己使用起来最习

    2024年 5月 14日
关注微信