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.
}