攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制
Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应。为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值。Hibernate通过标识符生成器来为OID赋值。
一、指定标识符生成器:
使用<id>元素的子元素<generator class="increment"/>来指定。Hibernate提供的内置标识符生成器:
A、increment:适用于代理主键。由Hibernate自动以递增的方式生成标识符。
B、identity:适用于代理主键。由底层数据库生成。前提条件是底层数据库支持自动增长字段类型,比如:DB2\MySQL\MS SQL Server\Sybase\HypersonicSQL.
C、sequence:适用于代理主键。由底层数据库的序列生成。前提是底层数据库支持序列。如:DB2\PostgreSQL\Oracle\SAP DB;
D、hilo:适用于代理主键。Hibernate根据high\low算法生成标识符。
E、native:适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity、sequence或hilo.
F、uuid.hex:适用于代理主键。Hibernate采用128位的UUID算法来生成。
G、assigned:适用于自然主键。由Java程序指定。
H、select:适用于遗留数据库中的代理主键或者自然主键。由数据库中的触发器来生成标识符。(具体机制不清楚)
I、foreign:(暂不了解)
二、increment标识符生成器:
Hibernate在插入记录时首先执行以下select max(id) from tableName;来获取当前最大的id值,然后在此基础上按照增量增加。
该机制在并发操作时可能会出现要插入的多条记录id值相同的情况,所以此种方式仅仅在只有单个Hibernate应用进程访问数据库的情况下才能有效工作。其他的涉及到并发插入的情况也会失效。
适用场景:
A、由于该机制生成标识符不依赖于底层数据库,因此适合于所有的数据库系统。
B、适用于只有单个Hibernate应用进程访问同一个数据库的场合(多线程应该也会失效),集群环境下不推荐使用。
C、OID必须为long、int或short类型。
三、identity标识符生成器:
该机制要求底层数据库把主键定义为自动增长的字段类型。
适用场景:
A、底层数据库支持自动增长类型的字段。
B、OID必须为long、int或short类型。
四、sequence标识符生成器:
适用场景:
A、底层数据库必须支持序列。
B、OID必须为long、int或short类型。
五、hilo标识符生成器:
适用场景:
A、由于该机制生成标识符不依赖于底层数据库,因此适合于所有的数据库系统。
B、OID必须为long、int或short类型。
C、high\low算法生成的标识符只能在一个数据库中保证唯一。
六、映射复合自然主键:
配置文件示例:
<composite-id>
<!-- key-property标签表示哪一些属性对应复合主键 -->
<key-property name="id" column="id" type="string"></key-property>
<key-property name="name" column="name" type="string"></key-property>
</composite-id>
Java代码示例:
Customer cu = new Customer();
cu.setName("Tom");
cu.setCompanyId(1L);
session.get(Customer.class,cu);
说明:
要使上面session的get()方法生效,要求Customer必须实现Serializable接口,且重写equals()和hashcode()方法。
七、总结:
MySQL:indentity\increment\hilo\native
MS SQL Server:identity\increment\hilo\native
Oracle:sequence\seqhilo\hilo\increment\native
跨平台开发:native
(声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。)
攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制的更多相关文章
- 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序
1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...
- 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)
本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...
- 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...
- 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题
一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...
- 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务
一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...
- 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置
一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...
- 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)
Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...
- 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略
本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...
- 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合
一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...
随机推荐
- c++ SOA Axis2c 编译安装
Axis2C 安装过程 1设置环境变量 export AXIS2C_HOME=/usr/local/axis2c 2.下载源码包解压编译安装 cd axis2c-src-1.6.0 ./configu ...
- 话说好像是这样,ios下面通常用iframe来打开你的scheme地址; Android下通常用location.href来。。。 不过实际情况好像比这个复杂得多。。
http://js.40017.cn/touch/hb/p/openApp.js/** * Created by wsy10943 on 2015/5/18. */ window._web_publi ...
- oracle 存储过程中调用存储过程
create procedure sp_name() begin ……… end 比如: create procedure pro_showdbs() show datebase; end //用ex ...
- Java实验四和实验五
实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1. 掌握OOP方式进行程序设计的方法, 2. 了 ...
- 一名Delphi程序员的开发习惯
一名Delphi程序员的开发习惯 有关开发习惯的一些想法,如鲠在喉,不吐不快.究其发贴动机,当然不排除有骗取参与分的可能,但另一方面,也希望能给同行(念Xing)者提供一些 建议,或者参考(希望不是误 ...
- GNOME启动时激活NumLock(小键盘数字锁定)
首先下载numlockx官方源提供的安装包,解压后进入目录运行终端,切换到root账户执行以下命令: python ./setup.py 然后依次点击GNOME菜单项上的“系统->首选项-> ...
- pom.xml中引入局域网仓库
<repositories> <repository> <id>nexus</id> <name>my-nexus-repository&l ...
- 把图标改成web字体
一.下载自己想要的矢量图标,然后在AI中打开二.在AI中将有瑕疵的图标修改一下,再分别另存为svg格式的图标三.打开IcoMoon Web app网页,然后点击左上角的+Import Icons添加你 ...
- 【XLL 框架库函数】 InitFramework
初始化框架库,它是简单的初始化临时 XLOPER/XLOPER12 内存结构,释放任何已经分配的内存. short WINAPI InitFramework(void); 参数 这个函数没有参数 备注 ...
- 创建URL为空的解决办法
在使用+URLWithString:或-initWithString:创建一个URL对象时,提供的参数字符串必须符合RFC 2396标准(O网页链接.而这两个方法又是根据RFC 1738(O网页链接和 ...