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

问题描述 投票:0回答:2

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

一个示例实体;

@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字段重复qazxsw poi声明。有没有办法隐藏这个包含丑陋的硬编码全类名的注释?

后脚本 我之前使用@GenericGenerator@MappedSuperClass类包含BaseEntity字段,但由于某些技术原因,我不得不放弃使用这样的超类。显然,这是解决这个问题的最简单方法。

java hibernate spring-data-jpa id-generation
2个回答
1
投票

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

a.b.jpa.entity

这用@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; 注释a.b.jpa.entity下的所有类,这是我的问题的完美解决方案。基本上使它可用于所有实体。

发电机代码;

@GenericGenerator

以及下列州的实体;

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


1
投票

你也可以使用@GeneratedValue

@MappedSuperclass

然后,您的实体可以扩展它:

@MappedSuperclass
public abstract class BaseEntity {

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

    // getters, setters here

}
© www.soinside.com 2019 - 2024. All rights reserved.