在我的模型中,我有一个带有该字段的实体购买
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 字段生成密钥?