Как переопределить @GeneratedValue, объявленный в mapped-суперклассе? - PullRequest
5 голосов
/ 25 апреля 2011

У нас есть @MappedSuperclass class Entity, который определяет идентификатор по умолчанию и генератор:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Override
public K getId() {
    return id;
}

Я хочу вообще не использовать генератор в подклассе Foo, потому что я сам предоставлю первичный ключ.

Я должен расширить Foo от базового класса Entity, потому что много и много функций зависят от этого базового класса. Похоже, аннотация @AttributeOverrides не поддерживает переопределение @GeneratedValue.

1 Ответ

0 голосов
/ 11 июля 2013

Похоже, что Foo на самом деле не является подтипом Entity и никогда не должно было его расширять.Наследование это сильный контракт.Вы не продлили бы что-то, только чтобы получить доступ к некоторым методам.

В спящем режиме, когда вы получаете объект Foo из базы данных, которую вы на самом деле также выбираете из таблицы Entity.Обе таблицы объединяются через их поле @Id, вы увидите, что Id в Foo будет таким же, как Id в Entity.

Это позволяет нам сделатьследующие.

Entity entity = new Foo();
if (entity instanceof Foo) {
  //we have a Foo object
} else if( entity instanceof ...) {
  //we have a ...
}

Если вы хотите указать свой собственный идентификатор, вы больше не должны расширять суперкласс.Если у вас есть много логики, которую вы хотите включить в ряд классов гибернации, но они на самом деле не являются подтипами класса, рассмотрите возможность использования @Embedded.

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