我有以下实体结构:
@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有什么问题吗?或者我错过了什么?
答案 0 :(得分:12)
在尝试实现应用程序范围内的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 {}
虽然以这种方式做事似乎非常愚蠢(至少对我来说)确实有效。
答案 1 :(得分:10)
以下是JPA 1.0规范关于SequenceGenerator
注释的说法:
9.1.37 SequenceGenerator Annotation
SequenceGenerator
注释 定义了一个主键生成器 当a时,可以通过名称引用 生成器元素是为GeneratedValue
注释。一个 可以指定序列生成器 实体类 或主键字段或属性上的 。该 生成器名称的范围是全局的 到持久性单位(跨所有 发电机类型)。
映射的超类不是实体。所以根据我阅读规范的方式,你想做什么是不可能的。将Intermed
类设为实体或将SequenceGenerator
放在子类上。