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

时间:2017-12-22 01:34:51

标签: java hibernate spring-data-jpa id-generation

我的项目中有许多实体使用相同的自定义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字段重复@GenericGenerator个decleration。有没有办法隐藏这个包含丑陋的硬编码完整类名的注释?

post scriptum
我以前使用@MappedSuperClassBaseEntity类包含id字段,但由于某些技术原因,我不得不放弃使用这样的超类。显然,这是解决这个问题的最简单方法。

2 个答案:

答案 0 :(得分:1)

我提出的解决方案是一个Java技巧,我的所有实体都在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 }}

答案 1 :(得分:1)

您也可以使用@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

}

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

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