Hibernate中的标识符,该标识符具有基于实体属性的动态前缀



我是spring和spring引导的新手,通过开发一个简单的应用程序来四处玩耍。我有下面提到的用例。

在我的spring-boot项目中,我有以下类定义。

public class Issue {
@Id
@GenericGenerator(name = "sequence_issue_id", strategy = "com.app.mycompany.AgileCenterServices.util.IssueIdGenerator",
parameters = @Parameter(name = "ProjectKey", value = "PeopleCenter" ))
@GeneratedValue(generator = "sequence_issue_id")
@Column(unique = true)
private String id;
private String projectId;
}

我有一个IssueIdGenerator类,它将动态值设置为Issue POJO类中的id参数。

但是,在执行此操作时,我希望为id参数设置一个前缀。

我应该如何将此动态前缀值发送到IssueIdGenerator类。

前缀值不是固定值,将作为Issue POJO类的属性接收。

因此,我想将这个前缀值传递给IssueIdGenerator类,该前缀值作为Issue POJO类中的一个属性存在。

通过定义自定义生成器,(使用生成器)离用例越近。

中提供的示例https://www.baeldung.com/hibernate-identifiers是:

让我们创建一个生成器,用于生成包含字符串的标识符前缀和数字:

public class MyGenerator    implements
IdentifierGenerator, Configurable {
private String prefix;
@Override
public Serializable generate(
SharedSessionContractImplementor session, Object obj) 
throws HibernateException {
String query = String.format("select %s from %s", 
session.getEntityPersister(obj.getClass().getName(), obj)
.getIdentifierPropertyName(),
obj.getClass().getSimpleName());
Stream ids = session.createQuery(query).stream();
Long max = ids.map(o -> o.replace(prefix + "-", ""))
.mapToLong(Long::parseLong)
.max()
.orElse(0L);
return prefix + "-" + (max + 1);
}
@Override
public void configure(Type type, Properties properties, 
ServiceRegistry serviceRegistry) throws MappingException {
prefix = properties.getProperty("prefix");
} 
} 

>

在本例中,我们覆盖IdentifierGenerator接口中的generate()方法,并首先从表单前缀XX的现有主键。

然后,我们在找到的最大数字上加1,并附加前缀属性以获取新生成的id值。

我们的类还实现了可配置接口,这样我们就可以在configure()方法中设置prefix属性值。

接下来,让我们将这个自定义生成器添加到一个实体中。为此,我们可以将@GenericGenerator注释与策略参数一起使用包含生成器类的完整类名:

@Entity 
public class Product {
@Id
@GeneratedValue(generator = "prod-generator")
@GenericGenerator(name = "prod-generator", 
parameters = @Parameter(name = "prefix", value = "prod"), 
strategy = "com.baeldung.hibernate.pojo.generator.MyGenerator")
private String prodId;
// ... 
} 

此外,请注意,我们已将前缀参数设置为"prod"。

让我们看一个快速的JUnit测试,以便更清楚地了解id生成的值:

@Test 
public void whenSaveCustomGeneratedId_thenOk()
{
Product product = new Product();
session.save(product);
Product product2 = new Product();
session.save(product2);
assertThat(product2.getProdId()).isEqualTo("prod-2"); 
} 

这里,使用"prod"前缀生成的第一个值是"prod-1",然后通过"prod-2"。


另一种选择是使用复合密钥(JPA规范):

复合主键必须对应于单个持久字段或属性,或一组这样的字段或属性如下所述。必须定义主键类来表示复合主键。复合主键通常出现在当数据库密钥由几个栏。使用EmbeddedId和和IdClass注释以表示复合主键。参见第9.1.14节和第9.1.15节。

最新更新