Hibernate对象标识符

Hibernate提供的内置标识符生成器

Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键来识别或区分同一个表的不同记录。Hibernate使用OID(对象标识符)来统一两者之间的矛盾,OID是关系数据库中的主键(通常称为代理主健)在Java对象模型中的等价物。

在对象-关系映射文件中,<id>元素用来设置对象标识符,比如:
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
          <generator class="identity" />
        </id>
<generator>元素用来设定标识生成器。Hibernate提供了标识符生成器接口: org.hibernate.id.IdentifierGenerator接口;并且提供了多种内置的实现。例如: org.hibernate.id.IdentityGenerator;org.hibernate.id.IncrementGenerator;它们的缩写名分别为:identity和increment。在设置<generator>子元素的class属性时,既可以提供完整的标识符生成器的类名,也可以给定缩写名,因此以下两种方式是等价的。

<id name="id" type="java.lang.Integer">

<column name="ID" />

<generator class="org.hibernate.id.IdentityGenerator" />

</id>

或者:

<id name="id" type="java.lang.Integer">
            <column name="ID" />
          <generator class="identity" />
        </id>



标识符生成器


         


increment  


适用于代理主键。由Hibernate自动以递增的方式生成标识符,每次增加1。
优点:由于它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。
缺点:只适合有单个Hibernate应用进程访问同一个数据库,在集群环境下不推荐使用它。 另外,OID必须为long,int,short类型,如果为byte类型,则会有异常。


identity 


适用于代理主键。由底层数据库生成标识符。前提条件是底层数据库支持自动增长字段类型。(oracle数据库不能用它)


sequence


适用于代理主键。Hibernate根据底层数据库的序列来生成标识符。前提条件是底层数据库支持序列。(oracle数据库能用它)


hilo 


适用于代理主键。Hibernate根据high/low算法来生成标识符。Hibernate把特定表的字段作为"high"值.在默认情况下选用hibernate_unique_key表的next_hi字段。它的机制不依赖于底层数据库系统,因此它适合于所有的数据库系统。high/low算法生成的标识符只能在一个数据库中保证唯一。


native


适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence, hilo。很适合于跨平台开发,即同一个Hibernate应用需要连接多种数据库系统。


uuid.hex


适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。UUID算法能够在网络环境中生成唯一的字符串标识符。这种标识符生成策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。


assigned


适用于自然主键。由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setID()方法声明为private类型,应该尽量避免使用自然主键。



代理主键:

    
注意:
 不具有义务含义,所以它可以适应不断变化的业务需求,它通常为整数类型,比如short、long、int,以及它们的包装类型。

自然主键:

   具有业务含义。

几种常用数据库系统中可使用的标识符生成器:

MYSQL:identity、increment、hiho、native

MS SQL
Server
identity、increment、hiho、native

Oraclesequence、identity、increment、hiho、native

跨平台开发:native



几个例子:

1、如果主键字段为自增类型,
那么对应的.hbm.xml文件中的id字段的xml声明,
应该这么写:
<generator class="native" />
例如:
<id
column="user_id"
name="Id"
type="integer"
>
<generator class="native" />
</id>
其实这个native并非实际的类型,而是hiberante根据
当前使用的数据库,自动使用对应的类型。
例如:如果sqlserver,native就对应identity
见Hiberante参考:
native(本地)
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。



2、如果主键字段不设置为自增,但是int型的
可以使用increment,由hibernate产生主键。
<generator class="increment" />
不过这种方法,对于并发量大的应用,似乎最好不要采用。
见hiberante参考:
increment(递增)
用于为long,
short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 
在集群下不要使用。



3、如果使用uuid.hex产生的随机32位数最为主键
那么数据库的id字段类型为char,长度为32
hbm.xml中写为: <generator class="uuid.hex"
/>
另外,uuid.string也是功能类似。
uuid.hex产生的是32位的16进制数字的字符串。
而uuid.string产生的是16个字符长的任意ASCII字符组成的字符串
见参考:
uuid.hex
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。 
uuid.string
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在PostgreSQL数据库中

时间: 2024-10-27 18:56:33

Hibernate对象标识符的相关文章

Hibernate对象标识符生成策略

increment:由Hibernate自动以递增的方式生成标识符,适用于代理主键: identity:由底层数据库生成标识符,适用于代理主键: sequcence:由Hibernate根据底层数据库的序列生成标识符,适用于代理主键:(MySQL不适用) hilo:由Hibernate根据high/low算法生成标识符,适用于代理主键: native:根据底层数据库对自动生成标识符的支持能力,来选择identity/sequcence/hilo,适用于代理主键. 使用increment生成的表是

(三)映射对象标识符(OID)

所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 用对象标识符(OID)来区分对象 例子: hibernate.cfg.xml 1 <?xml version='1.0' encoding='utf-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration

hibernate.hbm.xml 配置总结

大部分内容取自: [Hibernate总结系列]....hbm.xml配置 基本配置结构 1 <?xml version="1.0" encoding='UTF-8'?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-mappi

hibernate映射标识符

①hibernate用对象标识符OID来区分对象 ②hibernate对象标识符生成策略 主键(业务主键&&代理主键):代理主键不具有业务性 1.increment:由hibernate自动以递增的方式生成标识符 2.identity :由底层数据库生成标识符 3.sequcence:由hibernate根据底层数据库的序列生成标识符 4.hilo :hibernate 根据high/low算法来生成标识符 5.native :根据底层数据库对自动生成标识符的支持能力,来选择生成策略

精通Hibernate——Java的内存地址与Hibernate的内置对象标识符

在Java语言中,判断两个对象引用变量是否相等,有以下两种比较方式: (1)比较两个变量所引用对象的内存地址是否相同,"=="就是比较的内存地址.此外,在Object类中定义的equals(Object o)也是按内存地址来比较的.如果用户自定义的类没有覆盖equals(Object o)方法,也是按照内存地址来比较的.例如,以下代码用new语句共创建了两个Customer对象,,并定义了三个Customer类型的引用变量,c1,c2,c3: Customer c1 = new Cus

Hibernate逍遥游记-第4章映射对象标识符-increment、identity、hilo、native、assigned、sequence、&lt;meta&gt;

1. 1 package mypack; 2 3 import java.lang.reflect.Constructor; 4 import org.hibernate.*; 5 import org.hibernate.cfg.Configuration; 6 import java.io.*; 7 import java.sql.Time; 8 import java.util.*; 9 10 public class BusinessService{ 11 public static S

攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制

Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应.为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值.Hibernate通过标识符生成器来为OID赋值. 一.指定标识符生成器: 使用<id>元素的子元素<generator class="increment"/>来指定.Hibernate提供的内置标识符生成器: A.increment:适用于代理主键.由Hibernate自

映射对象标识符

一.关系数据库按主键区分不同的记录 在关系数据库表中,用主键来标识记录保证每条记录的唯一性, 作为主键的字段必须满足以下条件: .不允许为null .每条记录具有唯一的主键值,不允许主键值重复 .每条记录的主键值永远不会改变 在CUSTOMERS表中,如果把NAME字段作为主键,前提条件是: .每条记录的客户姓名不允许为null .不允许客户重名 .不允许修改客户姓名 NAME字段是具有业务含义的字段,把这种字段作为主键,成为自然主键.尽管也是可行的,但是不能满足不断变换的业务需求,一旦出现了允

Hibernate之:各种主键生成策略与配置详解

1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免. <id name="id" column="id"> <generator class="assigned" /> </id&g