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. mysql同一台服务器上不同数据库中个别表内容同步

    >>>>>>soft_wsx>>>>>>--数据备份与还原>>同步备用服务器--1.完全备份主数据库--2.使用带S ...

  2. 查找问题的利器 - Git Blame

    原文: http://gitbook.liuhui998.com/5_5.html  如果你要查看文件的每个部分是谁修改的, 那么 git blame 就是不二选择. 只要运行'git blame [ ...

  3. C#系统委托之Action And Func

    Action Action<T> Func Func<T> Action:封装一个方法,该方法不具有参数并且不返回值 public delegate void Action() ...

  4. atom 折腾记(转载的)

    http://www.bkjia.com/webzh/999078.html

  5. css实现背景颜色线性渐变

    http://www.qttc.net/201304316.html http://www.ruanyifeng.com/blog/2008/05/css_background_image_posit ...

  6. Python之socket简介

    http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx http://yangrong.blog.51cto.com/6945369/ ...

  7. iOS 目录的使用

    Table 1-1  Commonly used directories of an iOS app  Directory Description AppName.app This is the ap ...

  8. ffmpeg-20160803-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  9. php 获取IP

    <?php echo 'your ip is :'; if (@$_SERVER["HTTP_X_FORWARDED_FOR"]) $ip = $_SERVER[" ...

  10. Effective C++ -----条款48:认识template元编程

    Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率. TMP可被用来生成“基于政策选择组合”(based on ...