2016-08-10 12 views
1

私はEntityidを生成するためのベストプラクティスを見つけようとしています:春ユニークなID - シーケンスではありませんが、以下の要件に<code>Spring</code> で

  • を持っている必要がユニークである必要があります9桁
  • int型である必要がありますが
シーケンスすることはできません

uuidは要件を満たさないため使用できません。

私はHibernate現在のバージョン4.3.1を使用していますが、おそらく私は必要に応じて更新することができます。

+0

あなたはどのようなORMを使用しているの? –

+0

Entity Frameworkは.NETであり、JVMではありません。 – chrylis

+0

私の悪い - 固定された - ありがとう – yami

答えて

1

私はこの問題をこのように解決:

package com.project.generator; 

import ... 

public class IdGenerator extends SequenceGenerator 
{ 
    Random r = new Random(); 
    private Logger log = LoggerFactory.getLogger(IdGenerator.class); 
    Session session; 

    int attempt = 0; 

    public int generate9DigitNumber() 
    { 
     int aNumber = (int) ((Math.random() * 900000000) + 100000000); 
     return aNumber; 
    } 

    @Override 
    public Serializable generate(SessionImplementor sessionImplementor, Object obj) 
    { 
     session = (Session) sessionImplementor; 
     Integer id = generateRandomIndex(); 
     return id; 
    } 

    public Integer generateRandomIndex() 
    { 
      for (int i = 0; i < 3; i++) 
    { 
     log.info("attempt: " + i); 
     Integer a = generate9DigitNumber(); 

     log.info("index: " + String.valueOf(a)); 
     if (session.get(Xyz.class, a) == null) 
     { 
      log.info("not found this id"); 
      return a; 
     } else 
     { 
      log.info("found this id"); 
     } 
    } 

    for (int i = 100000000; i < 999999999; i++) 
    { 
     log.info("Is id free: " + i); 
     if (session.get(Xyz.class, i) == null) 
     { 
      log.info("id is free: " + i); 
      return i; 
     } 
    } 
     return null; 
    } 
} 

Entityクラス:

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "IdGenerator") 
@GenericGenerator(name = "IdGenerator", 
    strategy = "com.project.generator.IdGenerator", 
    parameters = { 
     @Parameter(name = "sequence", value = "xyz_id_sequence") 
    }) 
private Integer id; 
3

あなたはID

@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XyzIdGenerator") 
@GenericGenerator(name = "XyzIdGenerator", 
    strategy = "com.mycompany.myapp.id.BigIntegerSequenceGenerator", 
    parameters = { 
     @Parameter(name = "sequence", value = "xyz_id_sequence") 
    }) 
public BigInteger getId() 
{ 
    return id; 
} 


package com.mycompany.myapp.id; 

import org.hibernate.id.SequenceGenerator; 

public class BigIntegerSequenceGenerator 
    extends SequenceGenerator 
{ 
    @Override 
    public Serializable generate(SessionImplementor session, Object obj) 
    { 
     ... 
    } 
} 

を生成し、生成する機能でロジックを定義するカスタムIDジェネレータを使用することができます。

関連する問題