使用@MappedSuperclass注释的类上的@SequenceGenerator

gla*_*666 11 java orm hibernate jpa sequence-generators

我有以下我的实体结构:

@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 {}
Run Code Online (Sandbox Code Playgroud)

我得到以下例外:

    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
Run Code Online (Sandbox Code Playgroud)

当我在Intermed类上将@MappedSuperclass更改为@Entity时,一切正常.使用@MappedSuperclass和@SequenceGenerator有什么问题吗?或者我错过了什么?

Kal*_*lja 13

在尝试实现应用程序范围的id生成器时,我遇到了此问题中描述的相同问题.

解决方案实际上是第一个答案:将序列生成器放在主键字段上.

像这样:

@MappedSuperclass
public abstract class BaseEntity {
  @Id
  @SequenceGenerator(name = "seqGenerator", sequenceName = "DICTIONARY_SEQ")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqGenerator")
  private Long id;
}

@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Intermed extends BaseEntity {}

@Entity
public class MyEntity1 extends Intermed {}

@Entity
public class MyEntity2 extends Intermed {}
Run Code Online (Sandbox Code Playgroud)

虽然以这种方式做事似乎非常愚蠢(至少对我来说)确实有效.


Pas*_*ent 11

以下是JPA 1.0规范关于SequenceGenerator注释的内容:

9.1.37 SequenceGenerator注释

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

映射的超类不是实体.所以根据我阅读规范的方式,你想做什么是不可能的.要么使Intermed类成为实体,要么将类放在SequenceGenerator子类上.

  • "根据我阅读规范的方式" - 我喜欢它:) (5认同)
  • 所以没有办法为几个实体定义1个单一的"全局"序列? (2认同)