zoukankan      html  css  js  c++  java
  • hibernate主键生成策略

    在hibernate中,提供了多种主键生成器(不同的数据库,不同的表结构使用的主键生成策略也不相同),查阅相关资料经过实验总结如下:

    1.increment

    主键按照数值顺序递增,使用当前实例中最大值加1作为主键。很明显,在生成主键的过程中要对表进行一次遍历,查询出最大的值

    之后才能生成主键,同时,因为要比较出最大的值,因此在<id></id>中的type数据类型必须为数值型,否则会产生异常。

    注:即使在程序代码中设置了主键,hibernate也会按照主键最大值加1的方法生成主键,而不会使用代码中设置的主键。

    采用increment后控制台打印出:

    同时表中的数据也发生了变化:

    从截图中可以看出increment的实现原理,先在表中查询最大主键值,然后加1生成新主键,这种方式很明显不适用于数据量较大的项目。

    2.assigned

    使用这种方法,主键要提前设置,hibernate不干预。在   save()   之前指定一个主键(也就是自行设置主键,例如注册账户)。

    3.identity

    利用数据库提供的主键生成机制,例如MySQL,sqlserver中的自动增长生成主键。如果在建表的时候没有设置主键自增长就会报错。

    修改表属性就好了。(varchar数据类型不支持自增长)


    4.native

    hibernate会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
    由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

    (注:前提是数据库表中设置了主键自增,否则插入数据不成功;同时也要求主键数据类型为数值型)

    5.sequence

    采用数据库提供的sequence机制生成主键,Oracle中使用sequence(mysql不支持)

    http://www.cnblogs.com/yjmyzz/archive/2012/12/27/2835095.html

    6.uuid

    由hibernate基于128位唯一值算法,根据当前IP,时间,jvm启动时间,内部自增量产生等多个参数生成16进制数值

    (编码后以长度为32的字符串表示)作为主键。在一定程度上保持了产生ID的唯一性。

    因为是用长度为32的字符串表示,因此在配置文件中和JavaBean中ID对应的属性应为String类型。

  • 相关阅读:
    远程连接身份验证错误,又找不到加密Oracle修正
    PHP content-type为"application/json"的post过来的数据$_POST接受不到的问题
    PHP获取Cookie模拟登录
    Nodejs的模块系统以及require的机制
    Makefile 使用总结
    python笔记---需求文件requirements.txt的创建及使用
    Node+Express的跨域访问控制问题:Access-Control-Allow-Origin
    Redis常用命令入门5:有序集合类型
    Redis常用命令入门4:集合类型
    Redis常用命令入门3:列表类型
  • 原文地址:https://www.cnblogs.com/hello-daocaoren/p/5718756.html
Copyright © 2011-2022 走看看