Подтвердить что ты не робот

Hibernate XML Mapping: Lazy False или Fetch Select?

У меня есть простой вопрос. Я нашел эту конфигурацию 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 загружает все коллекции и объекты" на основе Fetching Strategies. Но при написании 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 = "выбрать" режим по умолчанию? Таким образом, я могу объявить ту же конфигурацию, что:

<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" ?

4b9b3361

Ответ 1

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

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 будет лениво загружать коллекцию и будет загружать ее с помощью select. Если вы установите lazy="false", тот же выбор будет выполнен, разница будет заключаться в том, что он будет выполняться с нетерпением. Надеюсь, это имеет смысл.

Посмотрите также: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

Ответ 2

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