Hibernate思维导图

  Hibernate映射

关于hibernate的映射要说明的一点就是关于ID的访问权限,peroperty以及field的区别;

表的主键在内存中对应一个OID对象描述标识符,需要在配置文件中指定对象标识符的生成方式

assinged是自然主键的方式,这种策略需要用户指定ID才可以。

其他的方式比如sequence通过序列生成主键,identity,increment等是自增长,这种方式生成的主键一般是hibernate生成的,所以我们在编写实体对象的时候,id的get和set权限应该注意

class  xxx{

      private long id;

     public long getId();

      private void serId();
}

在这里应该设置get的访问权限是public,set权限private,由于hibernate在访问实体模型的时候,是不考虑权限的,因此这样就避免了用户指定主键。

另外一个知识点就是,如果不通过property指定一个列,而使用field。那么hibernate就会直接访问属性,而不会通过get set访问属性

对象的映射标识符OID

这是一块相对来说也是hibernate重点,什么是OID?如何指定OID?OID与主键是什么关系?

什么是OID?

OID全拼是object identifier,也就是对象标识符,因为数据库表中一般都通过主键来识别一个中的不同行,而JVM中一般使用地址来识别不同的对象,在session缓存中,当然也需要一个标识符来表示不同的缓存对象,因此,OID也就排上了用场。

缓存的概念:

SessionFactory是重量级的缓存,里面包含了数据的连接,预定义的Sql等,而Session是轻量级的里面包含了一些增删查改的对象。

如果在一个JVM对象中,加入到不同的session中,也是不同的缓存对象,而不同的对象加入到同一个session中,也需要保证OID的不同,因为session不管你存的是什么都需要通过标识符来检索对象。

如何指定OID?

通常分为两种:

1.自然主键,也就是带有业务含义的,比如学生的学号,工作的编号,通常包含了年份,部门或者班级,专业等等业务上的意义,因此需要手动的合并或者拼接指定,这种情况下就需要使用assinged方式,这种方式如果不指定主键就提交缓存进行更新,会报错。

2 代理主键 也就是没有业务意义,通常通过编码自动生成

  increment:不依赖于底层数据库,适合单个数据库场合不适合集群,必须为long int short类型。插入式,先选择最大的id值,再加1

  identity:依赖底层数据库系统。支持自动增长字段: OID 为long,int,short

  sequence:MYSQL不支持序列。依赖底层,必须支持序列。Oracle db2 sap db  postgresql

  hilo:计算公式hi*(max_lo+1)+lo 不依赖底层数据库系统,Long,int,short,只能在一个数据库中保持唯一

  native:跨平台,自动选择使用哪个策略。

由于上面的identity,sequence都需要依赖于底层数据库,不同的数据库可能不支持这种方式。那么一般推荐使用native,自动进行选择。

OID与主键是什么关系

一般来说,OID就是一个对象持久化之前是null,持久化的时候hibernate或者我们手动指定一个id,这个ID被插入到数据库当做主键,在session中当做索引。也因为这个原因,需要保证OID与主键的一致性,比如类型啊,长度之类的。

关于Session缓存----清理缓存

缓存的概念,为了缓冲数据,减少与真实数据之间的交互,与计算机的缓存类似,经常访问硬盘的效率太低,IO太慢,就把内存当作缓存,CPU每次与内存直接交互,内存中找不到数据再去硬盘中读取。然而内存又觉得慢了,就弄个cahce当作缓存,经常访问的数据再放到这里,更加快了速度。

session缓存也是如此,与Web中的Session类似,在网页中,也有Session这样一种概念,比如我们登陆淘宝,会记录我们的用户信息,当浏览器关闭或退出时,Session关闭,这期间通过session来识别的用户的身份,无需每次登陆进行校验,hibernate也是如此,我们从SessionFactory中开启这个Session,持久化一个对象,然后提交事务,增删改查,最后关闭Session。

 那么session缓存具体有什么作用:

比如我们通过Session.get(xxx.class,new Long(1));来获取Session中的OID为1的对象,它会首先到缓存中查找,如果找到了就直接用, 如果找逼到就去读取数据库,然后存储到缓存中,第二次就可以直接从获取数据了。

这样就减少了访问数据库的频率!

另外我们频繁的修改一个对象,如果这个对象放在缓存中,而且还是用了事务,那么只有在事务commit的时候,才会执行真正的sql语句!

玩耍Hibernate系列(二)--基础知识的更多相关文章

  1. 玩耍Hibernate系列(一)--基础知识

    Hibernate框架介绍: Hibernate  ORM  主要用于持久化对象(最常用的框架) Hibernate  Search 用于对对象进行搜索,底层基于Apache Lucene做的 Hib ...

  2. MySQL系列(一)--基础知识(转载)

    安装就不说了,网上多得是,我的MySQL是8.0版本,可以参考:CentOS7安装MySQL8.0图文教程和MySQL8.0本地访问设置为远程访问权限 我的MySQL安装在阿里云上面,阿里云向外暴露端 ...

  3. 玩耍Hibernate系列(一)补充--基础知识

    基本概述: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库,Hibernate可以应用在任何 ...

  4. 1 python大数据挖掘系列之基础知识入门

    preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...

  5. MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

    上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...

  6. python大数据挖掘系列之基础知识入门

    preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...

  7. RabbitMQ系列(二)--基础组件

    声明:对于RabbitMQ的学习基于某课网相关视频和<RabbitMQ实战指南>一书,后续关于RabbitMQ的博客都是基于二者 一.什么是RabbitMQ RabbitMQ是开源代理和队 ...

  8. 【Git 系列】基础知识全集

    Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具. 一.Git 基础 ...

  9. 3.Swift翻译教程系列——Swift基础知识

    英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift是用来开发iOS和OS X应用的新语言,可是很多地方用起来跟C或者OC是 ...

随机推荐

  1. 【Uploadify】远程上传图片到【七牛云存储】

    1.下载Uploadify版本3.2.1 2.下载七牛SDK 解压后将 qiniu 文件夹copy到uploadify文件夹下 3.修改uploadify.php文件 <?php $verify ...

  2. jQuery实现的Div窗口震动效果实例

    本文实例讲述了jQuery实现的Div窗口震动效果.分享给大家供大家参考.具体如下: 这是一款jQuery窗口震动效果代码,在Div边框内点击一下鼠标,它就开始震动了,适用浏览器:IE8.360.Fi ...

  3. POJ C++程序设计 编程题#3 编程作业—文件操作与模板

    编程题#3: 整数的输出格式 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 1000kB 描述 利 ...

  4. DataGridView 控件用法(可能不是很全面,因为这是自己常常用到的一些小总结):

    一.DataGridView属性设置 1.我们单击选中行的时候,默认是选择一个单元格,不能选择一整行,我们只需设置DataGridView的属性SelectionMode为FullRowSelect ...

  5. float:left居中对齐

    <div class="M1180"><div class="services"> <div class="serv_c ...

  6. MongoDB(2):入门

    MongoDB入门教程(包含安装.常用命令.相关概念.使用技巧.常见操作等) http://www.jb51.net/article/51514.htm 这篇文章主要介绍了MongoDB入门教程,包含 ...

  7. CentOS下安装LNMP(LINUX+NGINX+MYSQL+PHP)环境

    一.安装Nginx最新版 首先查看是否有安装源包 yum list nginx  (或yum info nginx) 如果没有则 vi /etc/yum.repos.d/nginx.repo #添加如 ...

  8. ThinkPHP之中的getField、Find、select、返回数据类型详解(ThinkPHP之中所有数据读取了)

    小李子:用于演示作用的数据库表:customers 官方解读: “ 读取数据集其实就是获取数据表中的多行记录(以及关联数据),使用select方法 ” $customers=D('customers' ...

  9. php全角字符转换为半角函数 实例代码

    PHP全角半角转换函数,把目前能找到的所有全角都列出来了一个个替换吧. 之前试过网上找的通过ASCII之类的字符替换,发现很多莫名其妙的问题.最后还是换成下面的字符替换方式了,把目前能找到的所有全角都 ...

  10. php使用swoole实现一个简单的多人在线聊天群发

    聊天逻辑的好多细节没有实现,只实现群发. php代码: $serv = new swoole_websocket_server("127.0.0.1",3999); //服务的基本 ...