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 根据特定的表实现.这三种方式( increment/identity/sequence)当然是针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况下.可以选择第三种( sequence).或者用 native 让hibernate来帮选择identity、sequence、hilo.后边的自然主键( asigned)不推荐使用,因为自然主键就是具有业务含义的主键,在现在的软件开发结构中,已经很少有人用了.
 
下面总结一下几种常用数据库,可以使用的标识符类型.
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文件四个.
例 1:
<xml version="1.0"?>
  1. <!doctype hibernate-mapping
  2. public "-//hibernate/hibernate mapping dtd 2.0//en"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
  4. <hibernate-mapping>
  5.   <class name="mypack.hilotester"  table="hilo_tester">
  6.    
  7.     <id name="id" type="long" column="id">
  8.       <generator class="hilo">
  9.                 <param name="table">hi_value</param>
  10.                 <param name="column">next_value</param>
  11.                 <param name="max_lo">100</param>
  12.       </generator>
  13.     </id>
  14.     <property name="name" type="string" >
  15.         <column name="name" length="15" />
  16.     </property>
  17.    
  18.   </class>
  19. </hibernate-mapping>

例 2:

  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.   <class name="mypack.identitytester"  table="identity_tester">
  7.    
  8.     <id name="id" type="long" column="id">
  9.       <generator class="identity"/>
  10.     </id>
  11.     <property name="name" type="string" >
  12.         <column name="name" length="15"/>
  13.     </property>
  14.    
  15.   </class>
  16. </hibernate-mapping>

例 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.   <class name="mypack.nativetester" table="native_tester" >
  7.    
  8.     <id name="id" type="long" column="id">
  9.       <generator class="native"/>
  10.     </id>
  11.     <property name="name" type="string" >
  12.         <column name="name" length="15" />
  13.     </property>
  14.    
  15.   </class>
  16. </hibernate-mapping>

例 4:

  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.   <class name="mypack.incrementtester" table="increment_tester" >
  7.    
  8.     <id name="id" type="long" column="id">
  9.       <meta attribute="scope-set">private</meta>
  10.       <generator class="increment"/>
  11.     </id>
  12.     <property name="name" type="string" >
  13.         <column name="name" length="15" />
  14.     </property>
  15.    
  16.   </class>
  17. </hibernate-mapping>
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值