Есть ли способ переопределить унаследованную стратегию генерации? - PullRequest
1 голос
/ 10 октября 2011

Я расширяю сущность, которая автоматически не генерирует свой идентификатор.

Я хочу переопределить стратегию генерации для AUTO в моем производном классе.

Как то так.

@Entity
public class Base {

    @Id
    @Column(name = "id")
    public Integer getId() {
      return id;
    }

}

@Entity
public class Extender extends Base {

    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getId() {
        return super.getId();
    }
}

Вот что я получаю, когда пытаюсь это сделать:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Extender column: id (should be mapped with insert="false" update="false")

Я понимаю, почему это происходит, но мне нужно знать, есть ли правильный способ сделать это.

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Это невозможно, потому что вы можете определить первичный ключ только один раз, а GeneratedValue может быть только там, где определен первичный ключ.И то же самое со словами из спецификации:

2.4 Первичные ключи и идентификация объекта
... Первичный ключ должен быть определен ровно один раз в иерархии объектов.

11.1.17 Аннотация GeneratedValue
... Аннотация GeneratedValue может применяться к свойству первичного ключа или полю сущности или сопоставленного суперкласса вместе с аннотацией Id.

0 голосов
/ 10 октября 2011

Это не выглядит правильно.Если вы хотите использовать наследование, вы должны либо

  • указать @javax.persistence.Inheritance в базовом классе и выбрать стратегию отображения наследования (enum InheritanceType)
  • annotateкласс Base с @javax.persistence.MappedSuperclass

Также обратите внимание на аннотацию @javax.persistence.Transient, которая дает вам возможность определить свойство в суперклассе или суперинтерфейсе без необходимости указывать там отображение.

Мне вообще не нравится наследование в модели данных, так как разработчики склонны использовать оператор instanceof, который даст неожиданные результаты во время выполнения, если у вас нет фактического экземпляра вашего класса сущностей, но естьГенерируемый Hibernate прокси-объект (в случае отложенной загрузки).

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