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)生成机制的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序

    1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...

  2. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  3. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  4. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

    一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...

  5. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  6. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  7. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  8. 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略

    本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...

  9. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

随机推荐

  1. Zebra_Form Packages: Zebra_Form Controls Generic XSS_Clean Classes: Zebra_Form_Control Class: Zebra_Form_Control

    http://stefangabos.ro/wp-content/docs/Zebra_Form/Generic/Zebra_Form_Control.html#methodset_rule

  2. 【Java】Java 深入探讨 单例模式的实现

    在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容易出现问题.下面就单例设计模式详细的探讨一下.   所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在 ...

  3. Oracle语句优化之一

    public List<TdDepartment> createZtreeDep(String compId) { List<TdDepartment> dd = new Ar ...

  4. Range Sum Query 2D - Mutable & Immutable

    Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the recta ...

  5. sharepoint 2010 页面刷新时滚动条位置保持不变 Controlling scrollbar position on postback

    sharepoint 2010 页面刷新时滚动条位置保持不变 Controlling scrollbar position on postback在sharepoint 2010中,如果当前页面的篇幅 ...

  6. Java多线程Socket在控制台输出的多人聊天室编程

    服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...

  7. Unity3d 怪物死亡燃烧掉效果

    效果 BurnToFadeOut.shader代码 Shader "BurnToFadeOut" { Properties { _StartColor ("Start C ...

  8. apache官网怎样下载apache HTTP Server服务器

    我相信有些朋友刚用apache服务器时,都希望从官网上下载,而面对着官网上众多的项目和镜像以及目录,也许有点茫然.下面是具体步骤 第一步:打开apache官网 第二步:点击右上角Download,出现 ...

  9. Centos 用户登录失败N次后锁定用户禁止登陆

    针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁 Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁 ...

  10. js事件监听器用法实例详解

    这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ...