Java 休眠唯一密钥生成器

Java 休眠唯一密钥生成器,java,hibernate,uniqueidentifier,Java,Hibernate,Uniqueidentifier,在我的模型中,我有一个实体购买字段 protected String licenceKey; 我必须为这个字段生成一个唯一的20个字符的键作为值,并且它必须是使用SecureRandom生成的唯一值。我尝试使用IdentifierGenerator接口,但它不起作用,我不知道如何检查该值是否已经存在,并在本例中强制生成另一个键 @Override public Serializable generate(SessionImplementor session, Object object

在我的模型中,我有一个实体购买字段

    protected String licenceKey;
我必须为这个字段生成一个唯一的20个字符的键作为值,并且它必须是使用SecureRandom生成的唯一值。我尝试使用IdentifierGenerator接口,但它不起作用,我不知道如何检查该值是否已经存在,并在本例中强制生成另一个键

@Override
public Serializable generate(SessionImplementor session, Object object) 
    throws HibernateException {

    String key;
    Purchase existingPurchase;
    do {
        key = (RandomStringUtils.random(20, 0, 0, true, true, null, 
            new SecureRandom())).toUpperCase();
        existingPurchase = new PurchaseDao().getProductByLicenceKey(key);
    } while (existingPurchase != null);
    return key;
}
这是实现这一目标的正确途径吗?我的错误是什么

更新:
现在我设法使用了这个代码,它生成了正确的许可证密钥。但因此我不得不将licenceKey注释为@Id——否则它不会生成任何密钥。如何克服这个问题并强制Hibernate为非ID字段生成密钥?

首先,您的代码使用@ID的原因是,现在串行密钥是您的主键,如果发现两行具有相同的主键,数据库将抛出错误;在您的情况下,使用相同的串行密钥

此外,在代码中,问题是您自己正在检查唯一性。你应该把这个留给DB。您可能需要阅读“唯一”约束。基本上,这意味着它不是主键,但它在所有其他行中仍然是唯一的

现在。你的问题分为两部分: 1) 如何生成包含20个字符的唯一密钥

要生成安全的唯一密钥,可以尝试几种框架。OpenSSL是我所知道的最好的一个。有几个教程可以让您学习如何将openssl与Java结合使用

2) 如何使钥匙独一无二

要使密钥唯一,请使用数据库提供的“唯一”约束。如果您使用的是hibernate,则可以在“LicenseKey”字段上方使用:

@Column(name="licence_key" unique="true"
protected String licenceKey;
如果您使用的是普通Java,那么您可以转到数据库,并在那里添加唯一键约束。例如,在MySQL中,命令是:

alter table <table_name> add unique(<column_name>);

运行此代码时会发生什么情况?
try {
    //insert your row here. If the exception will be thrown, then you can catch that in the catch block.
} catch(Exception e) {
    //catch the exception here.
} finally {
    //do something here.
}