我的实体具有以下结构:
@MappedSuperclass public abstract class BaseEntity { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGenerator") private Long id; } @MappedSuperclass @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @SequenceGenerator(name = "seqGenerator", sequenceName = "DICTIONARY_SEQ") public abstract class Intermed extends BaseEntity {} @Entity public class MyEntity1 extends Intermed {} @Entity public class MyEntity2 extends Intermed {}
我得到以下异常:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [context/applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unknown Id.generator: seqGenerator
当我在Intermed类上将@MappedSuperclass更改为@Entity时,一切正常。使用@MappedSuperclass和@SequenceGenerator是否有任何问题?还是我错过了什么?
这是JPA 1.0规范对SequenceGenerator注释的说明:
SequenceGenerator
9.1.37 SequenceGenerator批注 该SequenceGenerator注解定义了可以由名称当用于指定的发电机元件被参考的主键生成 GeneratedValue注释。可以 在实体类 或 主键字段或属性上 指定序列生成器 。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。
该SequenceGenerator注解定义了可以由名称当用于指定的发电机元件被参考的主键生成 GeneratedValue注释。可以 在实体类 或 主键字段或属性上 指定序列生成器 。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。
GeneratedValue
映射的超类不是实体。因此,按照我阅读规范的方式,您不可能做任何事情。使Intermed该类成为实体或将其SequenceGenerator放在子类上。
Intermed