我的项目中有许多实体使用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技巧,我的所有实体都在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
。
你也可以使用@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
}