`

ID生成策略

阅读更多
ID生成策略


1.XX.hbm.xml方式

a、常用四个:native identity sequence uuid
   Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式 
       特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式
        
b、     
        <!-- UUID 生成策略   -->  
        <!-- ID类型 必须是 String  -->  
        <!-- 类似于网卡生成的类型   -->  
       <class name="Person">  
        <id name="id">  
        <generator class="uuid"></generator>  
        </id>  
          <property name="name"/>  
          <property name="weight"/>  
       </class>


        <!--native 生成策略-->  
        <!-- ID类型 必须是 int-->  
        <!--由数据库自动递增-->  
        <id name="id" >
             <generator class="native"></generator>
         </id>

 
         <id name="id" column="team_id">
             <generator class="identity"/>
         </id> 


2.JPA注解生成方式@GeneratedValue
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
TABLE:使用一个特定的数据库表格来保存主键。 
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
IDENTITY:主键由数据库自动生成(主要是自动增长型) 
AUTO:主键由程序控制。

a、  @GeneratedValue    默认为native

b、  @GeneratedValue(strategy=GenerationType.AUTO)
   主键自增长 
   i.     默认:对 MySQL,使用auto_increment
   ii.    对 Oracle使用hibernate_sequence(名称固定)

c、  @GeneratedValue(strategy=GenerationType.IDENTITY) 
   不能用于oracle,因为oracle不支持IDENTITY; oracle是SEQUENCE

d、  SEQUENCE(@GeneratedValue(strategy=GenerationType.SEQUENCE))
    @SequenceGenerator(可自定义在数据库生成指定的sequence名)
  例如:
  
//定义sequence名为teacherSEQ 
   @SequenceGenerator(name="teacherSEQ",sequenceName="teacherSEQ_DB")
    public class Teacher {
        private int id;
      }
    
    //调用自定义的teacherSEQ
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="teacherSEQ")
    public int getId() {
       return id;
    }
     public void setId(int id) {
       this.id = id;
     }

e、Table
    @Entity 
    @TableGenerator(name="sequence_team",table="team")  //可以设置表名,表列名,表初始值等等信息 从而取代了@Table(name="team")    
     public class Team { 
       private int id;   
       private String name;     
       
       @Id  
       @GeneratedValue(strategy=GenerationType.TABLE,generator="sequence_team")   
       public int getId() {   
        return id;   
       }  ........
   }











Hibernate的id生成策略有下面几种:[/
color]

1.Increment

用于为long,short或者int类型生成唯一标识,只有在没有其他进程往同一张表中插入数据库时才能使用。在集群下不要使用。

对于集群为什么不要使用,是因为在一个大型的项目中如果我们有很多的服务器为项目提供服务,这样就会出项一种情况,A服务在15:25拿到数据库中的数据的 id为15,此时B服务器向数据库中插入了一条数据,这时数据库中的id为16了,但A服务中的session依旧保存着15,但下一条数据通过A服务向数据库中保存数据的时候session会为id赋值为16,可数据库中的id已经为16了,所以这时保存就会出错。


2.identity:

对 DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 的内置标识字段提供支持。返回的标识符是 long,short 或者 int 类型的。


3.sequence

在 DB2,PostgreSQL,Oracle,SAP DB,McKoi 中使用序列(sequence), 而在 Interbase

中使用生成器(generator)。返回的标识符是 long,short 或者 int 类型的。


4.hilo

使用一个高/低位算法高效的生成 long,short 或者 int 类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和 next_hi)作为高位值的来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。


5.seqhilo

使用一个高/低位算法来高效的生成 long,short 或者 int 类型的标识符,给定一个数据库序列(sequence)的名字。


6.uuid

基于一个自定义的算法生成一个128位的UUID。所产生的价值
表示为32个十六进制数字的字符串。


7.guid

在 MS SQL Server 和 MySQL 中使用数据库生成的 GUID 字符串。


8.native

根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。


9.assigned

让应用程序在调用 save() 之前为对象分配一个标识符。这是 <generator> 元素没有指定时的默认生成策略。


10.select

通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。


11.foreign

使用另外一个相关联的对象的标识符。它通常和 <one-to-one> 联合起来使用。


12.sequence-identity

一种特别的序列生成策略,它使用数据库序列来生成实际值,但将它和 JDBC3 的getGeneratedKeys 结合在一起,使得在插入语句执行的时候就返回生成的值。目前为止只有面向 JDK 1.4 的 Oracle 10g 驱动支持这一策略。由于 Oracle 驱动程序的一个 bug,这些插入语句的注释被关闭了。

我们通常用的比较多的就是[color=red]native、identity、sequence在一些情况下我们会用到uuid,其他的就用的很少了。


举例说明uuid

下面来测试一下uuid,还用原来的Student类,既然是测试uuid那我们的id就必须为String类型了。


Student类
package cc.tukai.entity;

import java.io.Serializable;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Table;

//@Entity

//@Table(name = "Student")

public class Student implements Serializable {

         private static final long serialVersionUID = -5596241291862147220L;

         private String id;

         private String name;

         private int age;

         //@Id

         public String getId() {

                   return id;

         }

         public void setId(String id) {

                   this.id = id;

         }

         public String getName() {

                   return name;

         }

         public void setName(String name) {

                   this.name = name;

         }

         public int getAge() {

                   return age;

         }

         public void setAge(int age) {

                   this.age = age;

         }


Student.hbm.xml
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cc.tukai.entity">

         <class name="Student" table="student">

                   <id name="id" column="id">

                            <generator class="uuid"></generator>

                   </id>

                   <property name="name" type="java.lang.String">

                            <column name="name" length="32"></column>

                   </property>

                   <property name="age" type="java.lang.Integer">

                            <column name="age" length="10"></column>

                   </property>

         </class>

</hibernate-mapping>


分享到:
评论

相关推荐

    Hibernate教程02_ID生成策略

    在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...

    JAVA 的ID生成策略

    JAVA ID生成策略 JAVA ID生成策略是一种在Hibernate框架中使用的策略,用于生成实体类的主键值。这种策略在Annotation情况下,主要有三种方式生成主键值。 第一种方式是使用数据库的自动增长字段生成。这种方式...

    分布式ID生成策略_snowflake算法

    分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个数据实体通常都需要一个唯一标识符(ID)来区分其身份。Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用...

    分布式ID生成策略(1)_snowflake算法

    分布式ID生成策略是现代互联网应用中的重要组成部分,尤其是在大数据时代,每个请求、每条记录往往都需要一个全局唯一的标识。Snowflake算法就是一种被广泛使用的分布式ID生成方案,它由Twitter开源,具有时间戳、...

    gateway+sleuth+docker+单点登陆+全局ID生成策略.rar

    在Spring Cloud生态系统中,"gateway+sleuth+docker+单点登陆+全局ID生成策略"是一组关键组件,用于构建高效、可扩展的微服务架构。让我们深入探讨这些概念及其在实际开发中的应用。 首先,Spring Cloud Gateway是...

    java自动生成id策略

    在Java编程中,自动生成ID是一项常见的需求,特别是在数据库记录、分布式系统节点标识等领域。"java自动生成id策略"指的是设计并实现一种机制,确保...实际应用中,还需要根据业务需求和系统规模选择适合的ID生成策略。

    mybatis自定义生成代码策略示例

    在 MyBatis 中,我们可以自定义代码生成策略来满足特定的需求。 自定义 MyBatis 代码生成器涉及到以下几个核心概念: 1. **配置文件**:在 MyBatis Generator(MBG)中,我们首先需要创建一个 XML 配置文件,用于...

    一种简单的ID生成策略: Mysql表生成全局唯一ID的实现

    生成全局ID的方法很多, 这里记录下一种简单的方案: 利用mysql的自增id生成全局唯一ID. 1. 创建一张只需要两个字段的表: CREATE TABLE `guid` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1...

    全局唯一ID生成

    在实际应用中,我们可以根据业务需求选择合适的ID生成策略。例如,如果对ID的排序有要求,可以选择基于时间戳的方案;如果对ID长度有严格限制,可以考虑使用ObjectID;如果需要高并发且无特定顺序要求,雪花算法可能...

    基于TkMyBatis的通用Mapper的二次封装 主要讲Id的生成策略

    2. **扩展性**:设计ID生成策略时,考虑其可配置性和可扩展性,让不同的业务模块可以选择不同的ID生成策略。 3. **测试覆盖**:对修改后的代码进行全面的单元测试,确保新功能的正确性和原有功能不受影响。 4. **...

    javaID生成器javaID生成器

    ### Java ID生成器详解 #### 一、引言 在软件开发过程中,特别是在数据库操作时,经常需要为每个新创建的记录分配一个唯一的标识符(ID)。为了满足这一需求,Java 开发者们通常会设计一种高效且可靠的 ID 生成...

    细聊分布式ID生成方法.pdf

    通过对不同场景需求的分析,我们可以选择适合的ID生成策略。无论是基于时间戳排序还是利用数据库特性,亦或是采用高级算法如雪花算法,都应该根据具体的应用场景和技术栈来决定最佳实践方案。未来随着技术的发展,...

    go-id-builder ID生成器

    2. `watch.go`:这可能是用来监控和响应系统变化的代码,例如,当系统负载变化或新的数据库连接需要时,这个文件中的逻辑可能会自动调整ID生成策略。 3. `model.go`:文件中可能定义了与ID生成相关的数据模型,如...

    自动生成ID(32位)所用jar

    例如,Snowflake算法是一种广泛使用的分布式ID生成策略,由Twitter开源。它生成的是64位的ID,其中包括时间戳、工作节点ID和序列号,可以保证全局唯一且按时间顺序排序。虽然Snowflake不是Apache Commons Lang的一...

    Springboot唯一编号整合,vesta全局唯一id生成器

    - 对于超大规模的系统,可以考虑使用多层ID生成策略,比如区域节点+工作节点+序列号。 通过以上步骤,我们可以在SpringBoot项目中成功地集成Vesta ID Generator,为分布式系统提供稳定、高效的全局唯一ID生成方案...

    唯一uuidid生成器

    Vesta-ID-Generator这个文件名可能是特定的ID生成库,它可能提供了更高级的功能,比如定制化的ID生成策略,或者优化的性能以满足高并发环境的需求。在实际项目中,开发者可能会选择这样的库来代替标准的Java UUID...

    MybatisPlus主键生成策略方法详解.docx

    雪花算法是由Twitter开源的一种分布式ID生成策略,生成的ID是一个Long类型,由41位时间戳(毫秒精度)、10位机器ID(5位数据中心ID和5位机器ID)以及12位序列号组成。这样的设计确保了在分布式环境下的全局唯一性。...

    mysql雪花算法生成唯一整型ID主键的实现方法

    雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性的ID。在MySQL中实现雪花算法,主要是通过自定义函数来模拟这个过程。 首先,我们需要创建一个名...

    应用级自增ID的生成

    1. **Snowflake算法**:这是一种常见的分布式ID生成策略,由Twitter开源。它通过时间戳、工作节点ID和序列号三部分组成,确保全局唯一性。然而,这里的描述并没有明确提及Snowflake,而是暗示了可能有其他自定义实现...

Global site tag (gtag.js) - Google Analytics