11

我的实体具有以下结构:

@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 有什么问题吗?或者我错过了什么?

4

2 回答 2

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 {}

虽然以这种方式做事似乎非常愚蠢(至少对我而言),但它确实有效。

于 2011-06-21T18:11:03.730 回答
11

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

9.1.37 SequenceGenerator注解

注释定义了一个主键生成器,当为注释SequenceGenerator指定生成器元素时,可以通过名称引用该生成器 。GeneratedValue可以 在实体类主键字段或属性上指定序列生成器。生成器名称的范围对于持久性单元是全局的(跨所有生成器类型)。

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

于 2010-08-31T21:55:44.343 回答