Почему Hibernate ищет столбец дискриминатора, когда он уже знает целевой тип? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть пара классов (Foo и Moo), над которыми я работаю в спящем приложении. Оба класса расширяют Бар.

Foo --- extends ---> Bar 
Moo --- extends ---> Bar

Foo и Moo и Bar идентичны во всех отношениях, за исключением того, что каждый из Foo и Moo реализует свой интерфейс маркеров.

Другими словами, Foo реализует IFoo и расширяет Bar. Му реализует IMoo и расширяет Бар. Однако ни интерфейс IFoo, ни интерфейс IMoo не привносят в картину никаких новых методов, поскольку они являются просто интерфейсами маркеров.

Кроме того, у меня есть пара классов репозитория JPA.

@Repository
public class FooRepository extends JpaRepository<Foo, Long> {
    public Foo findFooById(id);
}

и

@Repository
public class MooRepository extends JpaRepository<Moo, Long> {
    public Moo findMooById(id);
}

Проблема:

Когда я вызываю findMooById, я получаю ошибку:

org.database.util.DatabaseException: ОШИБКА: столбец bla.dtype не существует.

Мне известно, что это происходит из-за того, что hibernate ищет столбец дискриминатора.

Вопрос

Мой вопрос: почему Hibernate ищет столбец дискриминатора?

Тип возврата каждого репозитория уже указывает тип возврата Moo или Foo. Репозиторий Moo не мог вернуть Foo, если бы захотел!

Дискриминатор не должен требоваться для определения, верно?

1 Ответ

0 голосов
/ 31 октября 2019

Если вы используете стратегию SINGLE_TABLE (или просто используете @Inheritance без указания стратегии, т. Е. Возвращаетесь к простой таблице по умолчанию), столбец дискриминатора будет REQUIRED каксогласно спецификации JPA, раздел 2.12 доступен по по этой ссылке .

Хотя в некоторых реализациях JPA можно загружать сущность без указания столбца дискриминатора, это не гарантирует переносимости между реализациями JPA.

...