gpt4 book ai didi

java - 如何使用相同的自定义 id 生成器统一多个实体的 @GenericGenerator 声明?

转载 作者:行者123 更新时间:2023-11-30 02:17:18 34 4
gpt4 key购买 nike

我的项目中有许多实体使用相同的自定义 IdentifierGenerator 来使用 SpringDataJPA/Hibernate 生成 @Id

示例实体;

@Entity
@Table(name = "CHAIRS")
public class ChairEntity {

@Id
@GeneratedValue(generator = "myGenerator")
@GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = "myGenerator")
protected String id;

// rest of the entity
}

但我不想为每个实体的每个 id 字段重复 @GenericGenerator 减速。有没有办法隐藏这个包含丑陋的硬编码完整类名的注释?

后记述
我之前使用 @MappedSuperClass 和包含 id 字段的 BaseEntity 类,但由于某些技术原因,我不得不放弃使用这样的父类(super class)。显然这是这个问题最简单的解决方案。

最佳答案

我想出的解决方案是一个 Java 技巧,我的所有实体都在 a.b.jpa.entity 下,我的生成器在 a.b.jpa.generator 下,并且自从 >@GenericGenerator可以直接在类上使用,我为a.b.jpa.entity包创建了一个package-info.java,其中包含以下内容;

@GenericGenerator(strategy = "a.b.jpa.generator.MyGenerator", name = MyGenerator.generatorName)
package a.b.jpa.entity;

import org.hibernate.annotations.GenericGenerator;
import a.b.jpa.generator.MyGenerator;

使用 @GenericGenerator 注释 a.b.jpa.entity 下的所有类,这是我的问题的完美解决方案。本质上使其可供所有实体使用。

生成器的代码;

public class MyGenerator implements IdentifierGenerator {

public static final String generatorName = "myGenerator";

@Override
public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object object) throws HibernateException {
return GeneratorUtil.generate();
}
}

以及处于以下状态的实体;

@Entity
@Table(name = "CHAIRS")
public class ChairEntity {

@Id
@GeneratedValue(generator = MyGenerator.generatorName)
protected String id;

// rest of the entity
}

这成功了,现在 @GenericGenerator 被定义在一个位置,为我的所有实体提供 MyGenerator 详细信息(如果其中任何一个实体希望使用它) ,他们只是利用 @GeneeratedValue

关于java - 如何使用相同的自定义 id 生成器统一多个实体的 @GenericGenerator 声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934878/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com