Hibernate 知识点梳理
1、对持久化对象的要求
1)提供一个无参构造器
2)提供一个标识属性,如id,通常映射为数据库表的主键字段。
3)为持久化类的字段提供get、set方法。
注:但不一定所有字段都这么做,对于不提供get、set方法的字段,在映射文件(*.hbm.xml)中要进行处理。
例如某个属性description未设置get、set方法,则其映射为:
<property name="description" type="string" column="descri" access="field"></property>
4)类不能定义为final的
5)若要把持久化类的实例放到set中,应重写持久化类的equals()、hashCode()方法
2、使用基本数据类型和包装类型的区别
1)基本数据类型和包装类型对应的hibernate映射类型相同(映射是一样的);
2)但基本类型可以直接运算、无法表达null、默认为0;
3)包装类默认为null,对于默认值有实际业务意义的要使用包装类
例如:Student类有一个int类型的score属性,表示学生的考试分数.int类型的score属性无法表达这样的业务需求:
* 如果score的属性为null,表示该学生的成绩是未知的,有可能得了100分,也有可能得了0分,只是暂时还不知道成绩
* 如果scope属性为0,表示学生考试成绩为0分.
* 在上面的情况中必须使用包装类型
3、 持久化类属性的策略
propertye (默认值):
表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。提高域(对象)模型透明性。
field
hibernate通过java反射机制直接访问类属性。对于没有get与set方法的属性可设置该访问策略。
noop
它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。
<!-- 该属性在Customer类中有get与set方法 -->
<property name="name" column="name" type="string"/> <!-- 该属性在Customer类中不存在get和set方法 -->
<property name="name" column="name" type="string" access="field" /> <!-- 该属性在Customer类中不存在,但在数据库存在该字段。
使用noop处理,查询的时候忽略该字段-->
<property name="name" column="name" type="string" access="noop"/>
属性策略示例
4、Java语言按内存地址(==)或equals()方法区分不同的对象
Hibernate中用对象标识符(OID)来区分对象
5、主键
1)必备条件
不能为null。
唯一,不能重复。
永远不会改变。
2)主键分类
业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。
逻辑主键(代理主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。
复合主键(联合主键):通过两个或者多个字段的组合作为主键。
自然主键:把具有业务含义的字段作为主键叫做自然主键。
代理主键:不具备业务含义的字段,该字段一般取名为“id”。(推荐)
3)生成策略
Increment
increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
Hibernate 会先读取表中的主键的最大值,向表中插入记录时, 就在 max(id) 的基础上递增,增量为1。
适用范围:
a 由于 increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。
b 适用于只有单个 Hibernate 应用进程访问同一个数据库的场合,在多线程情况下会有问题。
c OID必须为long、int或 short 类型,如果把OID定义为byte类型,在运行时会抛出异常。
Identity
identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型。
适用范围:
a 由于 identity 生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型。支持自动增长字段类型的数据库包括:DB2、 Mysql、MSSQLServer、Sybase等。
b OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常。
Sequence
sequence 标识符生成器利用底层数据库提供的序列来生成标识符.
Hibernate 在持久化一个 News 对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值
适用范围:
a 由于 sequence 生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列。支持序列的数据库包括:DB2 Oracle 等。
b OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常。
Hilo
hilo 标识符生成器由 Hibernate 按照一种 high/low 算法*生成标识符, 它从数据库的特定表的字段中获取 high 值,默认情况下,采用hibernate_unique_key表的next_hi字段。
Hibernate 在持久化一个 News 对象时, 由 Hibernate 负责生成主键值. hilo 标识符生成器在生成标识符时, 需要读取并修改 HI_TABLE 表中的 NEXT_VALUE 值.
适用范围:
a 由于 hilo 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
b OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
Native
native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.
适用范围:
a 由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
b OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
UUID
适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。
适用范围:
a 不依赖于底层数据库系统, 因此它适合所有的数据库系统
b OID 必须为String类型
Assigned
表示手工指定主键的值,适用于自然主键
############################# 2015-07-21新增######################################################
1、
在hibernate应用中,持久化类的访问方法有两个调用者,分别是Java应用程序和hibernate,他们之间的调用关系如下图:

当hibernate执行save、update、saveOrUpdate方法时调用Customer对象的getXXX方法获取新值或修改值传递给数据库,执行query、load、get等查询方法时调用Customer对象的setXXX方法从数据库获取customer对象并赋值。
Java应用程序调用Customer对象的getXXX()方法获取客户信息传递给用户,通过setXXX()方法设置用户输入的客户信息进行新增或更新操作。
注意:hibernate访问getXXX()、setXXX()方法时不受访问修饰符限制,即使是private也可以访问,而Java应用程序当方法访问修饰符为private时是不可访问方法的。
Hibernate 知识点梳理的更多相关文章
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...
- Memcache知识点梳理
Memcache知识点梳理 Memcached概念: Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的HAS ...
- [独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(九)数据库常用对象之package
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(八)常见Exception
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
- [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
随机推荐
- ORM艰辛路之EF
经过一段时间对EF的研究,发现EF还是有很大的作用的,起码比自己写代码快捷许多.不过往往一个学习一个新东西开始都是简单的,后面才慢慢了解到它的许多不方便 优点: EF在对一个实体的增删改以及继承方面做 ...
- JS-改变页面的颜色之变化核心-获取六位的随机数
前言:从JS-改变页面的颜色(一).JS-改变页面的颜色(二).JS-改变页面的颜色(三)三个简单的小白例,我们可以轻而易举的看到起变化的核心是——十六进制颜色值的获取方式,所以,我们这里总结一下获取 ...
- pkg-config
可以使用pkg-config获取的库需要有一个条件,那就是要求库的提供者,提供一个.pc文件.比如gtk+-2.0的pc文件内容如下: prefix=/usrexec_prefix=/usrlibdi ...
- Vagrant+virtualBox+pycham+python环境的安装及配置
概要: 通过Vagrant,virtualBox安装配置,把virtualBox虚拟机的linux项目映射windows本地项目中,在windows的pycharm工具中开发用python语言开发项目 ...
- hyper-v虚拟化管理
一. 什么是Hyper-V? Hyper-V是微软的一款虚拟化产品,是微软第一个采用类似Vmware和Citrix开源Xen一样的基于hypervisor的技术. Hyper-V ...
- 仿Spring读取配置文件实现方案
一.读取config和jar里的配置文件,以流的方式返回 /** * 根据路径,获取当前项目中路径(jar包和config文件)下的配置文件 * @param filePath 存放job配置信息文件 ...
- 史上最强大的40多个纯CSS绘制的图形
Square(正方形) #square { width: 100px; height: 100px; background: red; } Rectangle(矩形) #rectangle { wid ...
- 获取iPhone 联系人列表,并且根据分析得到的姓名首字母进行排序
获取手机联系人以iOS9为分界点,大家都知道到了iOS9很多方法都更新了,好多接口都弃用,被新的接口代替.这Demo种有新旧两个接口,使用前判断当前iOS版本. 下面是Demo连接地址:Github的 ...
- iOS中CocoaPads的安装与配置(总结)
来说一下安装CocoaPots的顺序: Xcode->homebrew->RVM->Ruby->CocoaPats; 这篇文章之讲解如何安装到Ruby的部分,关于安装好Ruby ...
- MongoDB服务重启及后台运行解决方法
1 在MongoDB 安装目录下 新建一个test文件夹 mkdir /test 2 切换到MongoDB的安装目录(可通过 find -name 'mongod'命令查找安装目录)下 执行: bin ...