Hibernate的主键生成策略详解编程语言

在Hibernate中,javabean + hbm.xml 又称作persistent object,即PO 持久对象。持久化对象的唯一标识 为OID。

Java按地址区分同一个类的不同对象.
关系数据库用主键区分同一条记录
Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系
对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID付值,hibernate 通过主键生成策略对OID进行赋值

Hibernate的主键分类
代理主键:Hibernate负责生成
自然主键:程序自己生成

hbm配置文件中的配置:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC  
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping package="com.my.bean" > 
    <class name="User" table="t_user"> 
        <id name="id"> 
            <!-- hibernate的主键生成策略 --> 
            <generator class="native"></generator> 
        </id> 
        <property name="username" ></property> 
    </class> 
 
</hibernate-mapping>

id:设定持久化类的 OID 和表的主键的映射
name: 标识持久化类 OID 的属性名
column: 设置标识属性所映射的数据列的列名(主键字段的名字).
unsaved-value:若设定了该属性, Hibernate 会通过比较持久化类的 OID 值和该属性值来区分当前持久化类的对象是否为临时对象,在Hibernate3中几乎不再需要.
type:指定 Hibernate 映射类型. Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁. 如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类型
Java 的基本数据类型和包装类型对应相同的 Hibernate 映射类型. 基本数据类型无法表达 null, 所以对于持久化类的 OID 推荐使用包装类型(integer,long,string等)

generator:设定持久化类设定标识符生成器
class: 指定使用的标识符生成器全限定类名或其缩写名

主键生成策略:

表示符生成器 描述
increment 适用于代理主键。由hibernate自动以递增的方式生成表识符,每次增量为1
identity 适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。
sequence 适用于代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。
hilo 适用于代理主键。Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。默认情况下,采用hibernate_unique_key表的next_hi字段。
native 适用于代理主键。根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo
uuid 适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。
assigned 适用于自然主键。由java程序负责生成标识符。不能把setID()方法声明为Private的。尽量避免使用自然主键。

increment 标识符生成器: 代理主键
increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值
Hibernate 会先读取表中的主键的最大值, 而接下来向表中插入记录时, 就在 max(id) 的基础上递增, 增量为 1.
适用范围:
由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统
适用于只有单个 Hibernate 应用进程访问同一个数据库的场合
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常
缺陷:存在线程并发问题

identity 标识符生成器: 代理主键
identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型(加1带走)
适用范围:
由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型. 支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

sequence 标识符生成器: 代理主键
sequence 标识符生成器利用底层数据库提供的序列来生成标识符
Hibernate 在持久化一个 News 对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值
适用范围:
由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle 等
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

hilo 标识符生成器:代理主键
hilo 高低位算法生成器, 使用高低位算法维护数据唯一。不依赖于数据库。将在数据库中创建一个用于标识数据库的表。
适用范围:
数据库不支持identity和sequence两种生成器时

native 标识符生成器:代理主键
native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器.
适用范围:
由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常

assigned 标识符生成器:自然主键
映射单个自然主键,UUID ,id(身份证)

uuid 32位标识符生成器:代理主键
自动生成UUID值
Hibernate会产生不重复的32位字符串作为主键

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12088.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论