一尘不染

用@MappedSuperclass注释的类上的@SequenceGenerator

hibernate

我的实体具有以下结构:

@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是否有任何问题?还是我错过了什么?


阅读 361

收藏
2020-06-20

共1个答案

一尘不染

这是JPA 1.0规范对SequenceGenerator注释的说明:

9.1.37 SequenceGenerator批注

SequenceGenerator注解定义了可以由名称当用于指定的发电机元件被参考的主键生成 GeneratedValue注释。可以
在实体类主键字段或属性上 指定序列生成器 。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。

映射的超类不是实体。因此,按照我阅读规范的方式,您不可能做任何事情。使Intermed该类成为实体或将其SequenceGenerator放在子类上。

2020-06-20