我有一個自定義 ID 生成器,它為我的物體 ID 生成一個帶有前綴的 UUID 字串,但是由于我為每個物體使用不同的前綴,我必須為每個物體創建一個 ID 生成類,有沒有辦法只為此使用一個類?
我的 ID 生成類是這樣的:
import java.io.Serializable;
import java.util.UUID;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentifierGenerator;
public class ProductIdGenerator implements IdentifierGenerator{
public static final String generatorName = "produtcIdGenerator";
@Override
public Serializable generate(SharedSessionContractImplementor arg0, Object arg1) throws
HibernateException {
String prefix = "PROD";
String uuid = UUID.randomUUID().toString().substring(0, 8);
return prefix uuid;
}
}
我的物體看起來像這樣:
@Entity
public class Product {
@Id
@GeneratedValue(generator = ProductIdGenerator.generatorName)
@GenericGenerator(name = ProductIdGenerator.generatorName, strategy = "net.ddns.mrq.util.ProductIdGenerator")
@Column(name = "product_id")
private String id;
private String name;
.
.
.
我有 8 個物體,我必須為每個具有不同前綴的物體創建 8 個這樣的類。
- 有沒有辦法讓它更動態,更少“耗時”?
- 有沒有辦法只改變每個類的前綴而不創建多個id生成類?
uj5u.com熱心網友回復:
我可以想出幾種方法來解決這個問題(這基本上是需要對自定義IdentifierGenerator進行引數化)。
一個想法涉及每個物體實作一個介面,該介面可以為該物體型別回傳適當的 ID 前綴。由于目標物體被傳遞給生成器的generate()方法,生成器可以將其轉換為該介面并要求它提供要使用的前綴。
另一種解決方案利用了IdentifierGenerators 可以實作org.hibernate.id.Configurable介面以將配置“注入”到它們中這一事實,并且@GenericGenerator注釋支持將這些設定為@Parameter注釋中的 s。這樣,每次使用都@GenericGenerator可以指定它希望自定義生成器使用的前綴。它看起來像這樣(注意,這是未經測驗的代碼):
public class ProductIdGenerator implements IdentifierGenerator, org.hibernate.id.Configurable {
public static final String GENERATOR_NAME = "produtcIdGenerator";
public static final String PREFIX_PARAM = "prefix";
private String prefix = "";
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
this.prefix = params.getProperty(PREFIX_PARAM, "");
}
@Override
public Serializable generate(SharedSessionContractImplementor session, Object entityObject) throws HibernateException {
String uuid = UUID.randomUUID().toString().substring(0, 8);
return prefix uuid;
}
}
對它的參考看起來像這樣:
@Id
@GeneratedValue(generator = ProductIdGenerator.GENERATOR_NAME)
@GenericGenerator(
name = ProductIdGenerator.GENERATOR_NAME,
strategy = "net.ddns.mrq.util.ProductIdGenerator",
parameters = {@Parameter(name = ProductIdGenerator.PREFIX_PARAM, value = "foo")})
private String id;
就我個人而言,我發現第二個想法更簡潔一些,但我認為第一個沒有任何問題。這是風格問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/534290.html
標籤:爪哇弹簧靴冬眠实体标识符
上一篇:Perlbrew庫管理
