Hibernate XML Mapping: Ленивый Ложь или Выборка Выборки? - PullRequest
20 голосов
/ 07 декабря 2010

У меня простой вопрос. Я нашел этот конфиг Hibernate в нашем проекте:

<many-to-one name="employee" 
    class="com.myapp.Employee"
    cascade="merge"
    lazy="false"
    fetch="select">
<column name="employee_id"
     sql-type="bigint" 
     not-null="true"/>
</many-to-one>

Не fetch = "select" означает "Ленивая загрузка всех коллекций и сущностей" на основе Стратегии извлечения . Но, написав lazy = "false" означают не ленивая загрузка. Таким образом, приведенный выше конфиг говорит: «Отключить отложенную загрузку. Включите отложенную загрузку». В сущности, это означает, что свойство загружено лениво?

Так что я мог бы сократить эту конфигурацию как:

<many-to-one name="employee" 
    class="com.myapp.Employee"
    cascade="merge"
    fetch="select">
<column name="employee_id"
     sql-type="bigint" 
     not-null="true"/>
</many-to-one>

Но не является ли fetch = "select" режимом по умолчанию? Таким образом, я могу объявить тот же конфиг:

<many-to-one name="employee" 
    class="com.myapp.Employee"
    cascade="merge">
<column name="employee_id"
     sql-type="bigint" 
     not-null="true"/>
</many-to-one>

Я прав? Неправильно? Идеи? Спасибо

Если я хочу включить отложенную загрузку, я должен добавить lazy = "true" и удалить lazy = "false" ?

Ответы [ 2 ]

43 голосов
/ 07 декабря 2010

Я думаю, что режим выборки и время выборки - понятия, которые не полностью перекрываются.

Lazy="true|false" определяет, будет ли ассоциация загружаться с нетерпением или по требованию.

fetch="select|subselect|join|batch" управляет загрузкой этой сущности или коллекции, когда она требуется для загрузки.

Итак, чтобы ответить на ваш вопрос, наличие fetch="select" означает:

"второй SELECT используется для извлечения связанной сущности или коллекции. Если вы явно не отключите отложенную выборку, указав lazy =" false ", этот второй выбор будет выполняться только при доступе к ассоциации. (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching)

Это не значит, что отложенная загрузка отключена! Это контролируется флагом lazy="true|false". С lazy="true" и fetch="select" Hibernate будет лениво загружать коллекцию и загружать ее с помощью выбора. Если вы установите lazy="false", будет выполнен тот же самый выбор, разница будет в том, что он будет выполнен с нетерпением. Надеюсь, это имеет смысл.

Посмотрите и здесь: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

1 голос
/ 07 декабря 2010

Если вы установите для него значение lazy, то внешняя карта не выберет сотрудника, если в этом нет необходимости. Извлечение показывает, как оно будет запрашивать сотрудника, если это необходимо.

...