2016-06-23 9 views
0

MybatisでキーとしてUUIDを使用しようとしています。通常、次の2つの方法があります。JPAまたはHibernateがUUIDをキーとして生成する方法は?

  1. コードでユーザーキーを生成します。
  2. Use uuid() method in mysql.

最初soluationは私の質問は、JPAやHibernateの場合と同様にキーとしてUUIDを生成するためのメソッドを実装する方法です、私にとってより良い選択すべきですか?それらのUUIDキーは標準のUUIDではありません。

  1. ダッシュなし。
  2. パフォーマンスを向上させるためにシーケンスを並べ替えます。

答えて

0

私は今、UUIDを生成するためにHibernateから `UUIDHexGenerator`を使用しました。

UUIDHexGenerator.java

/* 
* Hibernate, Relational Persistence for Idiomatic Java 
* 
* Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as 
* indicated by the @author tags or express copyright attribution 
* statements applied by the authors. All third-party contributions are 
* distributed under license by Red Hat Middleware LLC. 
* 
* This copyrighted material is made available to anyone wishing to use, modify, 
* copy, or redistribute it subject to the terms and conditions of the GNU 
* Lesser General Public License, as published by the Free Software Foundation. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
* for more details. 
* 
* You should have received a copy of the GNU Lesser General Public License 
* along with this distribution; if not, write to: 
* Free Software Foundation, Inc. 
* 51 Franklin Street, Fifth Floor 
* Boston, MA 02110-1301 USA 
* 
*/ 

import java.io.Serializable; 


/** 
* <b>uuid</b><br> 
* <br> 
* A <tt>UUIDGenerator</tt> that returns a string of length 32, 
* This string will consist of only hex digits. Optionally, 
* the string may be generated with separators between each 
* component of the UUID. 
* 
* Mapping parameters supported: separator. 
* 
* @author Gavin King 
*/ 

public class UUIDHexGenerator extends AbstractUUIDGenerator { 

    private String sep = ""; 

    protected String format(int intval) { 
     String formatted = Integer.toHexString(intval); 
     StringBuffer buf = new StringBuffer("00000000"); 
     buf.replace(8-formatted.length(), 8, formatted); 
     return buf.toString(); 
    } 

    protected String format(short shortval) { 
     String formatted = Integer.toHexString(shortval); 
     StringBuffer buf = new StringBuffer("0000"); 
     buf.replace(4-formatted.length(), 4, formatted); 
     return buf.toString(); 
    } 

    public Serializable generate() { 
     return new StringBuffer(36) 
      .append(format(getIP())).append(sep) 
      .append(format(getJVM())).append(sep) 
      .append(format(getHiTime())).append(sep) 
      .append(format(getLoTime())).append(sep) 
      .append(format(getCount())) 
      .toString(); 
    } 

    public static void main(String[] args) throws Exception { 
     UUIDHexGenerator gen = new UUIDHexGenerator(); 
     UUIDHexGenerator gen2 = new UUIDHexGenerator(); 

     for (int i=0; i<100; i++) { 
      String id = (String) gen.generate(); 
      System.out.println(id); 
      String id2 = (String) gen2.generate(); 
      System.out.println(id2); 
      String id3 = (String) gen2.generate(); 
      System.out.println(id3); 
     } 

    } 

} 

BytesHelper.java

/* 
* Hibernate, Relational Persistence for Idiomatic Java 
* 
* Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as 
* indicated by the @author tags or express copyright attribution 
* statements applied by the authors. All third-party contributions are 
* distributed under license by Red Hat Middleware LLC. 
* 
* This copyrighted material is made available to anyone wishing to use, modify, 
* copy, or redistribute it subject to the terms and conditions of the GNU 
* Lesser General Public License, as published by the Free Software Foundation. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
* for more details. 
* 
* You should have received a copy of the GNU Lesser General Public License 
* along with this distribution; if not, write to: 
* Free Software Foundation, Inc. 
* 51 Franklin Street, Fifth Floor 
* Boston, MA 02110-1301 USA 
* 
*/ 

public final class BytesHelper { 

    private BytesHelper() {} 

    public static int toInt(byte[] bytes) { 
     int result = 0; 
     for (int i=0; i<4; i++) { 
      result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i]; 
     } 
     return result; 
    } 

} 

AbstractUUIDGenerator.java

/* 
* Hibernate, Relational Persistence for Idiomatic Java 
* 
* Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as 
* indicated by the @author tags or express copyright attribution 
* statements applied by the authors. All third-party contributions are 
* distributed under license by Red Hat Middleware LLC. 
* 
* This copyrighted material is made available to anyone wishing to use, modify, 
* copy, or redistribute it subject to the terms and conditions of the GNU 
* Lesser General Public License, as published by the Free Software Foundation. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
* for more details. 
* 
* You should have received a copy of the GNU Lesser General Public License 
* along with this distribution; if not, write to: 
* Free Software Foundation, Inc. 
* 51 Franklin Street, Fifth Floor 
* Boston, MA 02110-1301 USA 
* 
*/ 
import java.net.InetAddress; 

/** 
* The base class for identifier generators that use a UUID algorithm. This 
* class implements the algorithm, subclasses define the identifier 
* format. 
* 
* @see UUIDHexGenerator 
* @author Gavin King 
*/ 

public abstract class AbstractUUIDGenerator { 

    private static final int IP; 
    static { 
     int ipadd; 
     try { 
      ipadd = BytesHelper.toInt(InetAddress.getLocalHost().getAddress()); 
     } 
     catch (Exception e) { 
      ipadd = 0; 
     } 
     IP = ipadd; 
    } 
    private static short counter = (short) 0; 
    private static final int JVM = (int) (System.currentTimeMillis() >>> 8); 

    public AbstractUUIDGenerator() { 
    } 

    /** 
    * Unique across JVMs on this machine (unless they load this class 
    * in the same quater second - very unlikely) 
    */ 
    protected int getJVM() { 
     return JVM; 
    } 

    /** 
    * Unique in a millisecond for this JVM instance (unless there 
    * are > Short.MAX_VALUE instances created in a millisecond) 
    */ 
    protected short getCount() { 
     synchronized(AbstractUUIDGenerator.class) { 
      if (counter<0) counter=0; 
      return counter++; 
     } 
    } 

    /** 
    * Unique in a local network 
    */ 
    protected int getIP() { 
     return IP; 
    } 

    /** 
    * Unique down to millisecond 
    */ 
    protected short getHiTime() { 
     return (short) (System.currentTimeMillis() >>> 32); 
    } 
    protected int getLoTime() { 
     return (int) System.currentTimeMillis(); 
    } 


} 
関連する問題