`

[转]Hibernate映射对象标识符(OID)与数据库主键对应关系

阅读更多

 

         Hibernate采用对象标识符,也就是通常我们所说的OID来创建对象和数据库表里记录的对应关系,对象的OID和表里的主键对应,所以说OID是非常重要的,不应该让程序来给它赋值.数据库区分同一表的不同记录是用主键来区分.数据库中的主键最重要的3个基本要素就是不允许为null,不允许有重复值,主键永远不会改变.所以通常我们设计表都会设计主键的值为自动增加,没有业务逻辑含义的一组数字,当然针对每个数据库,设置的方法也不同.但是都非常简单.加一个属性就可以了.
而JAVA区分同一类的不同对象是用内存地址,在JAVA语言中判断两个对象的引用变量是否想相等,有以下两种比较方式.1)用运算符”==”比较内存地址,此外还可以用Object的equals方法也是按内存地址比较.2)比较两个对象的值是否相同,JAVA中的一些覆盖了Object类的equals方法实现比较合适.例如String和Date类,还有JAVA包装类.如果是String.equals(String)这种方式的比较就是比较这两个String的值的.如果是Object原是的equals方法就是比较地址了.这点很容易混淆.
通常,为了包装Hibernate的OID的唯一性和不可变性,由Hibernate或者底层数据库来给OID赋值比较合理.因此我们在编程的时候最好把持久化类的OID设置为private或者protected类型,这样可以防止JAVA程序随便更改OID.而OID的get方法我们还是要设置为public类型,这样方便我们读取. 在对象-关系映射文件里的

        1)increment 代理主键,hibernate自动以递增的方式来生成标识符,每次增加1.
        2)identity 代理主键,由底层数据库生成标识符,前提就是底层的数据库支持自动增长的类型.
        3)sequence 代理主键,hibernate根据底层数据库生成的标识符,前提是底层数据库支持序列
        4)hilo 代理主键,hibernate根据higg/low算法来生成的标识符,把特定表的字段作为high的值,默认选用hibernate_unique_key表的next_hi字段
        5)native 代理主键,根据底层数据库对自动生成标识符的支持能力,还选择identity,sequence,或hilo.
        6)uuid.hex 代理主键,hibernate采用128位的UUID算法生成标识符,UUID算法能够在网络环境下生成唯一字符串标识符.不过字符串要比数据占用的空间多的多.所以不流行使用.
        7)assigned 适用于自然主键,由JAVA应用程序负责生成标识符,为了能让JAVA设置OID.不能吧setId方法设置为非公共类型了,这种方式也尽量避免使用.
         这里个人觉得第一种方式,也就是说由Hibernate来生成对象标识符的方式比较好.但是这种方式的缺点是只能一个Hibernate对应一个数据库的表.当同时创建了SeesionFactory实例的时候.两个或者更多的Hibernate对应同一个数据库的时候就会插入出错.这个时候我们可以选择第二种方式把标识符的生成工作交给底层数据库.还有一个小知识点要注意就是OID必须定义为long,int,short类型,如果定义为byte会报异常,这里推荐用long.
         总结一下,这7中生成OID标识符的方法,increment 比较常用,把标识符生成的权力交给Hibernate处理.但是当同时多个Hibernate应用操作同一个数据库,甚至同一张表的时候.就推荐使用identity 依赖底层数据库实现,但是数据库必须支持自动增长,sequence 以来底层数据库实现,但是数据库必须支持系列.hilo 根据特定的表实现.这三种方式了.当然针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况下.可以选择第三种.或者用native 让Hibernate来帮选择identity,sequence,或hilo.后边的自然主键不推荐使用,因为自然主键就是具有业务含义的主键,在现在的软件开发结构中,已经很少有人用了.下面总结一下几种常用数据库,可以使用的标识符类型.
MySQL:identity数据库底层实现,需要支持自动增长,increment由Hibernate实现,hilo用特定的表实现,
MSSQL:identity数据库底层实现,需要支持自动增长,increment由Hibernate实现,hilo用特定的表实现,
Oracle:sequence数据库底层实现,需要支持序列,increment由Hibernate实现,hilo用特定的表实现,
以上不难发现,所有的数据库都支持Hibernate用increment实现OID的生成,MYSQL和MSSQL数据库底层实现支持自动增长,而Oracle支持序列,还有用特殊表的实现方式这三个数据库都支持.还有一种实现方式适用于所有的数据库,就是native,由Hibernate去选择使用什么样的方式来生成IOD对象标识符,这种方式也是跨平台的.下面是各种设置方式的例子*.hbm.xml文件四个.例题来源孙MM的<<精通Hibernate>>一书.我非常喜欢这本书,讲的非常简单明了.感兴趣的朋友可以去买一本看看(当当打7.3折哦).

  1. <!---->xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping
  3. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  5. <hibernate-mapping>
  6.  
  7.   <class name="mypack.HiloTester"  table="HILO_TESTER">
  8.    
  9.     <id name="id" type="long" column="ID">
  10.     <generator class="hilo">
  11.                 <param name="table">hi_valueparam>
  12.                 <param name="column">next_valueparam>
  13.                 <param name="max_lo">100param>
  14.         generator>
  15.     id>
  16.  
  17.     <property name="name" type="string" >
  18.         <column name="name" length="15" />
  19.     property>
  20.    
  21.   class>
  22.  
  23. hibernate-mapping>
  24.  
  25. <!---->xml version="1.0"?>
  26. <!DOCTYPE hibernate-mapping
  27. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  28. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  29. <hibernate-mapping>
  30.  
  31.   <class name="mypack.IdentityTester"  table="IDENTITY_TESTER">
  32.    
  33.     <id name="id" type="long" column="ID">
  34.       <generator class="identity"/>
  35.     id>
  36.  
  37.     <property name="name" type="string" >
  38.         <column name="name" length="15"/>
  39.     property>
  40.    
  41.   class>
  42.  
  43. hibernate-mapping>
  44.  
  45. <!---->xml version="1.0"?>
  46. <!DOCTYPE hibernate-mapping
  47. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  48. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  49. <hibernate-mapping>
  50.  
  51.   <class name="mypack.NativeTester" table="NATIVE_TESTER" >
  52.    
  53.     <id name="id" type="long" column="ID">
  54.       <generator class="native"/>
  55.     id>
  56.  
  57.     <property name="name" type="string" >
  58.         <column name="name" length="15" />
  59.     property>
  60.    
  61.   class>
  62.  
  63. hibernate-mapping>
  64.  
  65. <!---->xml version="1.0"?>
  66. <!DOCTYPE hibernate-mapping
  67. PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
  68. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  69. <hibernate-mapping>
  70.  
  71.   <class name="mypack.IncrementTester" table="INCREMENT_TESTER" >
  72.    
  73.     <id name="id" type="long" column="ID">
  74.       <meta attribute="scope-set">privatemeta>
  75.       <generator class="increment"/>
  76.     id>
  77.  
  78.     <property name="name" type="string" >
  79.         <column name="NAME" length="15" />
  80.     property>
  81.    
  82.   class>
  83.  
  84. hibernate-mapping>

 

原文出处:http://www.blogjava.net/action/archive/2007/05/22/119134.html

分享到:
评论

相关推荐

    对象标识符(OID)白皮书

    对象标识符, 即 Object Identifier(OID) , 是 ISO/IEC(国际标 准化组织/国际电工委员会) 和 ITU(国际电信联盟) 三大国际权威 标准组织共同推动的标识体系, 用于标识“通信和信息处理世界中的 任何事物” 。...

    对象标识符(OID)白皮书(2015)

    对象标识符(OID)白皮书(2015)

    吴东亚:OID对象标识符技术在追溯领域的应用-v5

    OID对象标识符技术在追溯领域的应用,相关标准的制定。

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    精通Hibernate:对象持久化技术第二版part3

    本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

    6.3 Hibernate用对象标识符(OID)来区分对象 6.4 Hibernate的内置标识符生成器的用法  6.4.1 increment标识符生成器  6.4.2 identity标识符生成器  6.4.3 sequence标识符生成器  6.4.4 hilo标识符生成器  ...

    Hibernate内置标识符生成器

    Hibernate允许把OID定义为short,int,long以及他们的包装类型。

    MIB数据库里各OID代表的信息

    SNMP协议,MIB数据库里,OID所能获取的数据,例如: 对象名:ifMtu(2) OID:ifEntry.4 对象类型:Integer 访问模式:只读 描述:接口的最大传输单元。用来表示接口上可以发送或接受的最大帧 整理一下,方便新手熟悉...

    5.4空间数据库管理系统.pdf

    空间数据库管理系统 空间数据库管理系统 本节 内容 文件与关系数据库混合管理 5.4.1 全关系型空间数据库管理 5.4.2 对象关系数据库管理 5.4.3 面向对象空间数据库管理 5.4.4 空间数据管理 5.4 文件与关系数据库混合...

    Hibernate中单一映射笔记

    Hibernate开发过程(单一映射体) 1创建持久类XXXX.java(要有oid字段:唯一且不具有业务含义;所有属性都有getter/setter方法;空的构造方法;不含oid的构造方法) 2创建映射文件XXXX.hbm.xml(包,类,id,字段) 3...

    hibernate总结

    Hibernate映射一对一(通过主键实现一对一的关系) //主PO对象(一个员工对个应一个身份证) public class Employees implements Serializable{ private Integer empid; private String name; private String sex...

    pgsql数据库转mysql数据库步骤及注意.docx

    pgsql数据库转mysql数据库步骤及注意.docx

    hibernate 3中的缓存小结

    而Hibernate仅仅是把与当前持久对象关联的对象的OID存放到缓存中。 如果希望把整个关联的对象的所有数据都存入缓存, 则要在相应关联的对象的映射文件中配置元素 --&gt; &lt;/hibernate-mapping&gt;

    对象标识(OID)在医疗信息标准化中的应用.rar

    对象标识(OID)在医疗信息标准化中的应用.rar

    OID编码规则

    OID(Object Identifier)的十进制数字表达方式与16进制表达方式的相互转换规则 常用OID表达的含义

    Hibernate 课件及源代码

    内容涵盖安装 Hibernatetools 插件、Session 核心方法、持久化对象生命周期、对象关系映射(1-n、1-1、n-n、继承映射)、检索策略、检索方式(对象导航图、OID 检索、HQL、QBC、本地SQL)、Hibernate 一\二级缓存、...

Global site tag (gtag.js) - Google Analytics