私はEntity
のid
を生成するためのベストプラクティスを見つけようとしています:春ユニークなID - シーケンスではありませんが、以下の要件に<code>Spring</code> で
- を持っている必要がユニークである必要があります9桁
- int型である必要がありますが
uuid
は要件を満たさないため使用できません。
私はHibernate
現在のバージョン4.3.1を使用していますが、おそらく私は必要に応じて更新することができます。
私はEntity
のid
を生成するためのベストプラクティスを見つけようとしています:春ユニークなID - シーケンスではありませんが、以下の要件に<code>Spring</code> で
uuid
は要件を満たさないため使用できません。
私はHibernate
現在のバージョン4.3.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;
あなたは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ジェネレータを使用することができます。
あなたはどのようなORMを使用しているの? –
Entity Frameworkは.NETであり、JVMではありません。 – chrylis
私の悪い - 固定された - ありがとう – yami