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

Java 如何使用相同的自定义id生成器为多个实体统一@GenericGenerator声明?,java,hibernate,spring-data-jpa,id-generation,Java,Hibernate,Spring Data Jpa,Id Generation,在我的项目中,有许多实体使用相同的自定义IdentifierGenerator来使用SpringDataJPA/Hibernate生成@Id 模范实体 @Entity @Table(name = "CHAIRS") public class ChairEntity { @Id @GeneratedValue(generator = "myGenerator") @GenericGenerator(strategy = "a.b.jpa.generator.MyGener

在我的项目中,有许多实体使用相同的自定义
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
带有
BaseEntity
类,该类包含
id
字段,但由于一些技术原因,我不得不放弃使用这样的超类。显然,这是这个问题最简单的解决方案。

我提出的解决方案是一个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
详细信息,如果他们中的任何一个想要使用它,他们只需利用
@GeneratedValue
我提出的解决方案是一个Java把戏,我的所有实体都在
a.b.jpa.entity
下,和我的生成器在
a.b.jpa.generator
中,由于
@GenericGenerator
可以直接在类上使用,我为
a.b.jpa.entity
包创建了一个
包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
详细信息,如果其中任何实体希望使用它,它们只需使用
@GeneratedValue

,您也可以使用它

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

@Entity
@Table(name = "CHAIRS")
public class ChairEntity extends BaseEntity { ... }
你也可以使用

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

@Entity
@Table(name = "CHAIRS")
public class ChairEntity extends BaseEntity { ... }

我以前使用过这个,这是一个更好的解决方案,这是正确的,但是我的需求迫使我不要使用这样的超类。我修改了这个问题,但是你的答案在更广的范围内适合这个问题。我以前使用过这个,这是正确的,这是一个更好的解决方案,但是我的需求迫使我不要使用这样的超类。我修改了这个问题,但你的回答在更广泛的范围内适用于这个问题。