Hibernate игнорирует FetchType для одиночного наследования - PullRequest
1 голос
/ 20 декабря 2011

У меня есть 3 объекта, унаследованных от другого объекта. Я использую стратегию Single_Table

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

например. Классы B, C и D наследуются от A

На объекте B я с нетерпением загружаю другой объект X. К сожалению, Hibernate игнорирует мою аннотацию и создает выбор для каждой сущности B для выборки сущности X.

@ManyToOne(fetch=FetchType.EAGER)
private Projekt projekt;

Моя инструкция выбора выглядит следующим образом: «Выберите из A a´

Еще несколько примеров кода:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DType", discriminatorType = DiscriminatorType.STRING, length = 3)
public abstract class A {}


@Entity
@DiscriminatorValue(B.PREFIX)
public class B extends A {

   @ManyToOne(fetch=FetchType.EAGER)
   private Projekt projekt;
}

Теперь я ожидаю, что Hibernate запросит все классы, которые наследуются от A, что он и делает. К сожалению, он также выполняет оператор select для каждой строки результата, чтобы запросить «projekt», чего я хочу избежать.

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Hibernate не вставляет объединения в запросы SQL, сгенерированные из запросов HQL / JPQL для FetchType.EAGER.

Чтобы вставить join, вам нужно явно указать left join fetch, я думаю, он выигралне создает проблем для InheritanceType.SINGLE_TABLE, несмотря на то, что это отношение не существует в других подклассах:

from A a left join fetch a.projekt
0 голосов
/ 20 декабря 2011

Что вы хотите от этого?Если вы делаете «из А» - тогда он выбирает сущности всех унаследованных типов.Невозможно (или, по крайней мере, нелегко) создать SQL-запрос, который извлекает B, C, D, а затем для B извлекает X с нетерпением. Что вы хотите сделать?

Чтобы избежать многих запросов, вы можете установить BatchSize для ассоциации.Это оптимизирует загрузку X в пакетах - вместо одного запроса для каждого B.

Если вас интересуют только объекты B, вы можете написать запрос как "from B", и в этом случае ассоциация будет извлечена с нетерпением.

...