Hibernate的主键生成策略

对于不同的数据库和应用程序,主键的生成方式往往不同

Hibernate的主键生成策略分为3大类:Hibernate对主键id附值,应用程序对主键id附值,由数据库对id附值

   1.Hibernate对主键id附值:

         increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。

  这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,由于各个实例各自维护主键状态,不同实例可能产生同样的主键,从而造成主键重复的异常。因此,如果同            一个数据库有多个实例访问,这种方式应该避免使用

   2.应用程序对主键id附值:即编程人员自己对主键id附值或者使用相关联对象的主键

       foreign: 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用。

     assigned:应用程序自身对id附值。当在xml中设置<generator class="assigned"> 或者用annotation来设置(hibernate提供了多种生成器供选择,基于Annotation的方式通过@GenericGenerator实现,通过@GenericGenerator来提供一个id生成器)

                   @GeneratedValue(generator="paymentableGenerator")

                   @GenericGenerator(name = "paymentableGenerator", strategy = "assigned")

这样指定后,编程人员就应该自己负责主键id的负值

   3.由数据库对id附值:即你所用的数据库:eg,SQL Server2008,Oracle,MySQL它们来负责对主键id负值

         native: 对于 oracle 采用 Sequence 方式对主键id负值,对于MySQL 和 SQL Server 采用identity(自增主键生成机制,生成整型的id),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)。 

         identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,对于Oracle要设定sequence(MySQL 和 SQL Server 中很常用)。 
          等同于JPA中的INDENTITY。 

         sequence: 使用Oracle数据库的主键id生成策略,调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。

         uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型),适用于主键为String类型的

 

原文地址:https://www.cnblogs.com/SpringSmallGrass/p/3001948.html