关闭

Hibernate主键生成策略

590人阅读 评论(0) 收藏 举报
Hibernate为优秀的持久层框架的代表。在传统的JDBC+JavaBean操作中,实体对象都由程序员自己去封装,然后返回。而在Hibernate中,采用对象关系映射『ORM』,大大简化了对数据库的操作.

在数据库的设计和操作中,我们通常会给表建立主键。
主键,可以分为自然主键和代理主键。
自然主键表示:采用具有业务逻辑含义的字段作为表的主键。比如在用户信息表中,采用用户的身份证号码作为主键。但是这样一来,随着业务逻辑的变化,主键就有可能要更改。比如,假设哪天身份证号码升级成19,2位,那。。。。。。。
代理主键:在表中人为的增加一个字段,该字段并没有表示任何的业务逻辑,仅仅用来标识一行数据。比如说在用户信息表中,增加一个用户ID的字段。用来表示该条用户信息的记录。

通常情况下,用的比较多的是代理主键的形式。而且,我们习惯于于让该主键字段能够自动增长,来保证其唯一性。但是,不同的数据库自动增长的方式并不是相同的。如在SQLSERVER中,用identity,MYSQL中,有increment,ORACLE中通常采用sequence。这样一来,在数据库的主键列操作上,便会显得比较麻烦。
但是在Hibernate中,提供了主键生成策略。下面是比较常用的几种:
1:assigned
----表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。

其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。
2:increment
----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。
3:identity
----不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native
----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用

oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。

Xml代码 复制代码 收藏代码
  1. <id name="实体类属性名" type="java.lang.Integer">  
  2.       <column name="对应表中主键字段名" />  
  3.       <generator class="assiged|increment|identity|native|........" />  
  4. </id>  



采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了。

 

increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程。

identity:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护。

sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。

native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。

hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值

uuid.hex:代理主键,hibernate采用uuid 128位算法生成基于字符串的主键值

assign:适合于应用程序维护的自然主键。




 

0
0
查看评论

hibernate JPA注解主键生成策略

Id生成策略: @GeneratedValue,JPA通用策略生成器 。         JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.            TABLE:使用一个特定的数据库表格来保存主键。    ...
  • java122java
  • java122java
  • 2016-11-02 21:38
  • 322

hibernate native 主键生成策略

<br />前一次做个系统用的oracle数据库,使用hibernate生成主键的策略是SEQUENCE,当时觉得很累,因为不知道怎么的,oracle+sequence+trigger怎么也取不到新增数据时的主键值。<br /> <br />这次就把重点...
  • flash8627
  • flash8627
  • 2011-04-07 16:36
  • 8686

Hibernate面试题 --- Hibernate主键的生成策略(Oracle数据运用那种主键生成策略)

Hibernate主键的生成策略 "Customers" table="customers">        "id" column="id">...
  • hanxiaoshuang321123
  • hanxiaoshuang321123
  • 2011-12-24 13:39
  • 1044

【5】Hibernate的主键生成策略

1、表中主键分类: (1)自然主键:建表的时候,使用对象中本身的属性作为表的主键。 (2)代理主键:没有使用对象中的自身的属性作为表中的主键,使用和对象不相关的属性作为主键。 注:在建表的时候,建议使用代理主键,自然主键有可能会参与到业务逻辑中,有可能出现重复或者有的时候需要修改,主键不能修改...
  • lwt976647637
  • lwt976647637
  • 2016-11-26 15:57
  • 590

Hibernate中的6种主键生成策略和相应特点

1. increment:适用于short,int,long作为主键.不是使用的数据库自动增长机制. * Hibernate中提供的一种增长机制. * 先进行查询 :select max(id) from user; * 再进行插入 :获得最大值+1作为新的记...
  • whisely
  • whisely
  • 2017-04-30 16:07
  • 874

hibernate 配置Oracle主键生成策略

@Id @Column(name="[id]") @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="seqhilo") @SequenceGenerator(sequenceNam...
  • xwygn
  • xwygn
  • 2012-12-28 10:02
  • 2624

Hibernate自定义主键生成策略

在复习Hibernate的时候,又遇到了MySQL自增时,批量添加出问题的情况; 暂时写了一个可以实现MySQL自增主键生成器的代码,运行效率很差劲(*^__^*) 嘻嘻……但是功能都有   package pkg; import ja...
  • u013444177
  • u013444177
  • 2014-03-01 23:19
  • 625

Hibernate各种主键生成策略

<br />Hibernate各种主键生成策略详解<br />1、assigned<特点:可以跨数据库,人为控制主键生成,应尽量避免><br />    主键由外部程序负责生成,在 save() 之前必须指定一个。Hibe...
  • jun55xiu
  • jun55xiu
  • 2011-04-18 11:29
  • 1004

Spring hibernate annotation 开发主键生成策略

@Id:表示主键的映射,声明在主键的get方法前边,默认情况下主键利用assigned(用户提供)生成策略。如果想要设置API规范提供了四种主键生成策略: @GeneratedValue(strategy=GenerationType.AUTO)   &#...
  • ShangQuan2012
  • ShangQuan2012
  • 2016-09-09 10:01
  • 566

Hibernate主键生成策略之Hilo

使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi我们也可以自己设置自定义的表名和字段名          ...
  • daryl715
  • daryl715
  • 2007-12-19 11:02
  • 3133
    个人资料
    • 访问:557004次
    • 积分:5853
    • 等级:
    • 排名:第5220名
    • 原创:116篇
    • 转载:126篇
    • 译文:3篇
    • 评论:36条
    最新评论