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