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. 用绝对路径引用JS、CSS

    项目中,最好使用绝对路径引用JS和CSS文件,详情如下: 1.vm文件中: <link rel="stylesheet" href="$!{request.cont ...

  2. A Neural Probabilistic Language Model

    A Neural Probabilistic Language Model,这篇论文是Begio等人在2003年发表的,可以说是词表示的鼻祖.在这里给出简要的译文 A Neural Probabili ...

  3. 下载uboot的调试版本到开发板的sdram中运行

    开发环境:开发板:FriendlyARM Tiny6410 主机:CentOS release 6.4 (Final) 开发板与主机通过串口线连接 调试用的uboot源码为开发板光盘提供的u-boot ...

  4. objective-C运算符和表达式

    运算符可以分为以下几种: 算术运算符:+,-,*,/,%,++,—-. 关系运算符:<,>,<=,>=,==,!= 布尔逻辑运算符:!,&&,|| 位运算符:| ...

  5. ADO .NET 链接 增删改查

    ADO.NET: 数据访问技术 就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中也可以将数据库中的数据提取到内存中供程序调用 所有数据访问技术的基础 连 ...

  6. [leetcode]_Remove Nth Node From End of List

    题目:移除linked-list从尾到头的第N个元素 自我思路:因为题目给出的N是从链表尾开始计算的,单链表不存在从子指向父亲的反向指针,因此我先计算链表的整个长度len,然后用len - N来表示正 ...

  7. WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

    写Android程序的时候一般用WindowManager就是去获得屏幕的宽和高,来布局一些小的东西.基本上没有怎么看他的其他的接口. 这两天想写一个简单的类似于Toast的东西,自定义布局,突然发现 ...

  8. spark概论

    一.概述 1.轻:(1)采用语言简洁的scala编写:(2)利用了hadoop和mesos的基础设施   2.快:spark的内存计算.数据本地性和传输优化.调度优化,使其在迭代机器学习,ad-hoc ...

  9. C#发送邮件源码

    介绍 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/IP协议 ...

  10. [转]Posix-- 互斥锁 条件变量 信号量

    这是一个关于Posix线程编程的专栏.作者在阐明概念的基础上,将向您详细讲述Posix线程库API.本文是第三篇将向您讲述线程同步. 互斥锁 尽管在Posix Thread中同样可以使用IPC的信号量 ...