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