@SequenceGenerator для класса, помеченного @MappedSuperclass - PullRequest
11 голосов
/ 31 августа 2010

У меня есть следующая структура моих сущностей:

@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

Когда я меняю @MappedSuperclass на @Entity в классе Intermed, все работает нормально Есть ли проблемы с использованием @MappedSuperclass и @SequenceGenerator? Или я что-то пропустил?

Ответы [ 2 ]

13 голосов
/ 21 июня 2011

Я столкнулся с той же проблемой, описанной в этом вопросе, при попытке создания генераторов идентификаторов приложения.

Решение на самом деле в первом ответе: поместите генератор последовательности в поле первичного ключа .

Примерно так:

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

Хотя делать что-то таким способом кажется удивительно глупым (по крайней мере, мне), оно работает.

11 голосов
/ 01 сентября 2010

Вот что спецификация JPA 1.0 говорит о аннотации SequenceGenerator:

9.1.37 Аннотация SequenceGenerator

Аннотация SequenceGenerator определяет генератор первичного ключа, который может ссылаться по имени, когда элемент генератора указан для GeneratedValue аннотация. генератор последовательности может быть указан в классе сущности или в поле первичного ключа или свойстве . объем имени генератора является глобальным в единицу постоянства (через все типы генераторов).

И сопоставленный суперкласс не является сущностью. Таким образом, согласно тому, как я читаю спецификацию, то, что вы хотите сделать, невозможно. Либо сделайте класс Intermed сущностью, либо поместите SequenceGenerator в подклассы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...