2016-11-23 3 views
2

В нашем проекте мы используем Hibernate, и в журналах мы наблюдаем, что иногда используются ссылки Join и иногда Select для отношений (как я понимаю, это FetchMode), когда мы не указали FetchMode.Как hibernate определяет, какой из FetchMode используется по умолчанию?

Как Hibernate решить, какой из FetchMode использовать, если не указано?

Есть ли какие-либо спецификации для этого? Любые строки кода? Любая статья?

+0

http://www.solidsyntax.be/2013/10/17/fetching-collections-hibernate/ – Steephen

+0

Существует «когда» («Ленивый, нетерпеливый») и есть «как» («Выбрать, присоединиться и т. Д.») в отношении FetchMode. Кажется, вас интересует «как». Попробуйте прочитать официальную [документацию] (https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch20.html), есть некоторые детали о режиме по умолчанию. – aUserHimself

ответ

3

Если аннотация @Fetch Hibernate нет на поле, то FetchMode по умолчанию для этого поля является:

  • , если это поле имеет FetchType = EAGER, то FetchMode = JOIN.
  • В противном случае FetchMode = SELECT.

Мой источник этой информации является сам код (Hibernate 5.0): HERE, HERE и самое главное, HERE.

+0

Очень приятно. Я сделаю свой ответ более ясным. – Dherik

1

Означает сгенерированный SQL, если не задано значение FetchMode, а FetchType - EAGER, по умолчанию JOIN в спящем режиме.

К сожалению, я не могу найти эту информацию в официальных документах.

Об использовании SELECT даже когда JOIN по умолчанию, я предположил, что некоторые запросы, которые не могут быть решены в одном запросе, like this:

Но если вы позволите B без C, Hibernate просто нужно проверить наличие C на момент загрузки B. Но SELECT для проверки присутствия просто неэффективен, потому что тот же SELECT может не просто проверить наличие, но загрузить весь объект. Так ленивая загрузка уходит.