Похоже, что 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
.