玩耍Hibernate系列(二)--基础知识
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系列(二)--基础知识的更多相关文章
- 玩耍Hibernate系列(一)--基础知识
Hibernate框架介绍: Hibernate ORM 主要用于持久化对象(最常用的框架) Hibernate Search 用于对对象进行搜索,底层基于Apache Lucene做的 Hib ...
- MySQL系列(一)--基础知识(转载)
安装就不说了,网上多得是,我的MySQL是8.0版本,可以参考:CentOS7安装MySQL8.0图文教程和MySQL8.0本地访问设置为远程访问权限 我的MySQL安装在阿里云上面,阿里云向外暴露端 ...
- 玩耍Hibernate系列(一)补充--基础知识
基本概述: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库,Hibernate可以应用在任何 ...
- 1 python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
- MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化
上篇文章中 我们已经创建了EF4.1基于code first的例子 有了数据库 并初始化了一些数据 今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...
- python大数据挖掘系列之基础知识入门
preface Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们. Python数据分析与挖掘技术概述 所谓数据分析,即对已知的数据进行分析 ...
- RabbitMQ系列(二)--基础组件
声明:对于RabbitMQ的学习基于某课网相关视频和<RabbitMQ实战指南>一书,后续关于RabbitMQ的博客都是基于二者 一.什么是RabbitMQ RabbitMQ是开源代理和队 ...
- 【Git 系列】基础知识全集
Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目版本管理时的首选,非开发人员也可以用 Git 来做自己的文档版本管理工具. 一.Git 基础 ...
- 3.Swift翻译教程系列——Swift基础知识
英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift是用来开发iOS和OS X应用的新语言,可是很多地方用起来跟C或者OC是 ...
随机推荐
- 关于OJ上内存问题的试验
char类型占一个字节 int类型占4个字节 如果杭电OJ上给的范围是32678K,那么内存大小就是32678*1024=33554432 那么可以开到多大的数组呢?!可以开到很大,但是可用的就只有3 ...
- 手机连上wifi热点后自动弹窗的功能
使用buildroot编译bind DNS服务器 用buildroot来制作文件系统很方便,编译出来的文件系统是直接可用的,不用添加脚本等麻烦的工作,很多的库和app都可以直接添加到文件系统里边,如常 ...
- (图 BFS)走迷宫
题目: 给一个迷宫,求出从起点到终点的路径.迷宫 src.txt 文件内容如下,第一行是迷宫的行列数,后面行是迷宫,1表示可行走,0表示不可以通过,起点是最左上角,终点是最右下角: 解析: 其实就是图 ...
- .NET中的IO操作之文件流
读操作 //1.创建文件流 FileStream fsRead =new FileStream("1.txt",FileMode.Open); //2.创建缓冲区,正常情况下,是不 ...
- pthread_cond_wait避免线程空转
多线程对同一块区域进行操作时,需要定义如下两种类型的变量: pthread_mutex_t xxx; pthread_cond_t yyy; pthread_mutex_t类型的变量,即锁,对公共区域 ...
- JS数组(Array)处理函数总结
1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: <script type="text/javascript"&g ...
- SQL多表查询:内连接、外连接(左连接、右连接)、全连接、交叉连接
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPgAAADCCAIAAADrUpiXAAAGYklEQVR4nO3dQXqjuAJFYa1LC9J6tB
- OpenFileDialog使用方法
OpenFileDialog基本属性 AddExtension 控制是否将扩展名自动添加到文件名上 CheckFileExists 指示用户指定不存在的文件时是否显示警告 CheckPathExist ...
- <b>和<strong>标签区别
简单说, strong是web标准中xhtml的标签,加强语气,起强调作用(默认是采用加粗来实现强调),逻辑标签: b 是html的,bold粗体. web标准主张xhtml不涉及具体的表现形式,“强 ...
- php时间转换unix时间戳
本文介绍了php编程中unix时间戳转换的小例子,有关php时间转换.php时间戳的实例代码,有需要的朋友参考下. 第一部分,php 时间转换unix 时间戳实现代码. 复制代码代码示例: <? ...