`
xinklabi
  • 浏览: 1591956 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

Hibernate生成UUID算法

    博客分类:
  • Java
 
阅读更多
一、用一个128-bit的UUID算法生成字符串类型的标识符。

二、在一个网络中唯一(生成算法使用了IP地址)。

三、UUID被编码为一个32位16进制数字的字符串。
数据库相应的主键字段应该是varchar或者char型,32位,如果少于32位,在增加记录的时候你也许会遇到“ORA-01401: 插入的值对于列过大”的错误。
四、不推荐写成uuid.hex 推荐直接写成uuid 
从hibernate3.0开始已经不再支持 uuid.string,查看changelog可以发现: Changes in version 3.0 beta 1 (21.12.2004) * removed uuid.string and renamed uuid.hex to plain uuid,hibernate3.x的api中AbstractUUIDGenerator类只有UUIDHexGenerator子类了,使用时在 hibernate的映射文件中,配置成<generator class="uuid"/>;(其实写成uuid.hex也是可以用的,但官方的reference文档中是uuid,所以不推荐写成 uuid.hex)

五、hibernate中uuid.hex的生成算法

[java:showcolumns] view plain copy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1.   package  com.wallimn.util;    
  2.     
  3. import  java.io.Serializable;    
  4. import  java.net.InetAddress;    
  5. /**   
  6.  * 唯一主键生成办法。从Hibernate中提取出来。   
  7.  */     
  8. public   class  UUIDGenerator {    
  9.     
  10.  private   static   final   int  IP;    
  11.  public   static   int  IptoInt(  byte [] bytes ) {    
  12.   int  result =  0 ;    
  13.   for  ( int  i= 0 ; i< 4 ; i++) {    
  14.    result = ( result << 8  ) - Byte.MIN_VALUE + ( int ) bytes[i];    
  15.   }    
  16.   return  result;    
  17.  }    
  18.  static  {    
  19.   int  ipadd;    
  20.   try  {    
  21.    ipadd = IptoInt( InetAddress.getLocalHost().getAddress() );    
  22.   }    
  23.   catch  (Exception e) {    
  24.    ipadd = 0 ;    
  25.   }    
  26.   IP = ipadd;    
  27.  }    
  28.  private   static   short  counter = ( short 0 ;    
  29.  private   static   final   int  JVM = ( int ) ( System.currentTimeMillis() >>>  8  );    
  30.     
  31.  public  UUIDGenerator() {    
  32.  }    
  33.     
  34.  /**   
  35.   * Unique across JVMs on this machine (unless they load this class   
  36.   * in the same quater second - very unlikely)   
  37.   */     
  38.  protected   int  getJVM() {    
  39.   return  JVM;    
  40.  }    
  41.     
  42.  /**   
  43.   * Unique in a millisecond for this JVM instance (unless there   
  44.   * are > Short.MAX_VALUE instances created in a millisecond)   
  45.   */     
  46.  protected   short  getCount() {    
  47.   synchronized (UUIDGenerator. class ) {    
  48.    if  (counter< 0 ) counter= 0 ;    
  49.    return  counter++;    
  50.   }    
  51.  }    
  52.     
  53.  /**   
  54.   * Unique in a local network   
  55.   */     
  56.  protected   int  getIP() {    
  57.   return  IP;    
  58.  }    
  59.     
  60.  /**   
  61.   * Unique down to millisecond   
  62.   */     
  63.  protected   short  getHiTime() {    
  64.   return  ( short ) ( System.currentTimeMillis() >>>  32  );    
  65.  }    
  66.  protected   int  getLoTime() {    
  67.   return  ( int ) System.currentTimeMillis();    
  68.  }    
  69.      
  70.  private   final   static  String sep =  "" ;    
  71.     
  72.  protected  String format( int  intval) {    
  73.   String formatted = Integer.toHexString(intval);    
  74.   StringBuffer buf = new  StringBuffer( "00000000" );    
  75.   buf.replace( 8 -formatted.length(),  8 , formatted );    
  76.   return  buf.toString();    
  77.  }    
  78.     
  79.  protected  String format( short  shortval) {    
  80.   String formatted = Integer.toHexString(shortval);    
  81.   StringBuffer buf = new  StringBuffer( "0000" );    
  82.   buf.replace( 4 -formatted.length(),  4 , formatted );    
  83.   return  buf.toString();    
  84.  }    
  85.     
  86.  public  Serializable generate() {    
  87.   return   new  StringBuffer( 36 )    
  88.    .append( format( getIP() ) ).append(sep)    
  89.    .append( format( getJVM() ) ).append(sep)    
  90.    .append( format( getHiTime() ) ).append(sep)    
  91.    .append( format( getLoTime() ) ).append(sep)    
  92.    .append( format( getCount() ) )    
  93.    .toString();    
  94.  }    
  95.     
  96. }    
 

算法为引用。原文地址:http://wallimn.javaeye.com/blog/327844

分享到:
评论

相关推荐

    用hibernate形式uuid的生成算法

    ### 使用Hibernate形式生成UUID的算法解析 在Java开发领域,特别是使用Hibernate框架进行数据库操作时,唯一标识符(UUID)的生成是常见的需求之一。UUID(Universally Unique Identifier),即通用唯一识别码,是...

    Hibernate主键生成策略

    - **描述**:使用 hilo 算法生成主键,该算法需要在数据库中维护一个额外的表来存储主键信息。 - **优点**:支持高并发,性能良好。 - **缺点**:需要额外维护一个表。 - **应用场景**:适用于对主键性能有较高...

    hibernate主键生成策略

    【hibernate主键生成策略】是Hibernate框架中用于生成持久化对象主键的重要机制,它决定了如何在数据库中创建唯一的标识符。在SSH(Spring、Struts、Hibernate)架构中,Hibernate作为持久层框架,主键生成策略的...

    Hibernate中主键生成策略

    使用128位的UUID生成16进制表示的字符串作为主键。这在分布式环境中非常有用,因为每个节点都可以独立生成不冲突的主键。使用`@GeneratedValue(strategy = GenerationType.UUIDHEX)`。 7. **increment策略**: 在...

    Hibernate内置标识符生成器

    7. UUID(Universally Unique Identifier)生成器:Hibernate 提供了两种 UUID 生成器,`uuid.hex` 和 `uuid.string`。这两种生成器使用 128 位的 UUID 算法,生成全局唯一的标识符。`uuid.hex` 生成的是 32 位的...

    Hibernate主键生成方式

    - **定义**:由 Hibernate 基于 128 位唯一值产生算法生成 16 进制数值(编码后以长度 32 的字符串表示)作为主键。 - **应用场景**:适合需要跨平台且具有高度唯一性的场景。由于其生成的主键是全局唯一的,因此...

    hibernate 主键生成策略

    ### Hibernate 主键生成策略详解 Hibernate 是一款流行的 Java 持久层框架,它提供了对象关系映射(ORM)的功能,使得 Java 开发者能够更高效地与数据库进行交互。在 Hibernate 中,主键生成策略是一项核心功能,...

    hibernate的主键生成策略

    在Hibernate中,主键生成策略是确保实体类中的主键字段具有唯一标识的关键部分。以下是对Hibernate主键生成策略的详细说明: 1. **assigned**: 这种策略要求用户在调用`save()`方法之前手动设置主键值。Hibernate...

    hibernate源码分析过程

    id 算法可以是整型自增、sql server 等数据库的 identity、Oracle 的 sequence、hilo(高低位)算法、uuid、guid、程序赋值等。复合主键可以组合多个列来唯一标识一个对象。数据版本并发性控制可以使用版本、时间戳...

    Hibernate的主键生成方式

    ### Hibernate的主键生成方式详解 #### 一、概述 在使用Hibernate进行对象关系映射时,一个重要的概念就是如何为持久化实体类中的主键字段生成唯一标识符。主键是表中的一列或一组列,其值是唯一的,用于唯一地...

    Hibernate主键生成

    5. **hilo**:基于hi/lo算法,需要额外的数据库表来存储主键生成历史状态。提高性能,减少对数据库的交互次数。 6. **foreign**:使用外部表的字段作为主键,适用于关联表的情况。 7. **native**:Hibernate根据...

    mysql_guid主键生成方式范例

    在这个例子中,`@GeneratedValue(strategy = GenerationType.UUID)`告诉Hibernate使用UUID生成策略来自动填充`id`字段。这个字段的类型是`String`,因为它会存储32位的GUID字符串。 在Eclipse环境下,你需要设置好...

    hibernate映射文件--主键生成策略[参考].pdf

    8. uuid.hex:该策略由Hibernate基于128位UUID生成主键。 在实际应用中,我们可以根据不同的需求选择合适的主键生成策略,以确保数据的唯一性和一致性。例如,在集群环境下,我们可以选择native或sequence策略,以...

    hibernate第一天笔记

    主键生成策略还有多种方式,如`Assigned`(由外部程序负责),`Increment`(每次自增1,适用于MySQL),`Uuid`(生成UUID字符串),以及`Hilo`(高效ID生成算法)。选择哪种策略取决于具体需求和数据库类型。 ...

    hibernate中的generator的生成方式hibernate中的generator的生成方式

    - **定义**:采用高/低值算法生成主键值,先从数据库获取一个较高的起始值,然后在内存中递增,直到达到预先设定的上限再从数据库获取下一个起始值。 - **适用场景**:适用于多线程环境下的高并发场景。 - **配置...

    hibernate-mapping参数详解

    - `uuid.hex`、`uuid.string`:生成128位UUID,前者以16进制字符串表示,后者是未编码的UUID。 - `foreign`:使用关联表的字段作为主键。 8. `name`:指定持久化类的全限定名,如果不指定,Hibernate会认为这是一...

    java框架之hibernate

    - 使用128位UUID算法生成字符串类型的标识符。 - 具有全局唯一性。 #### 四、联合主键 在Hibernate中,可以使用复合主键来表示具有多个字段作为主键的实体。以下是一种定义复合主键的方法: ```xml ...

Global site tag (gtag.js) - Google Analytics