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类型。

  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/hello-daocaoren/p/5718756.html
Copyright © 2011-2022 走看看