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" ?
Ответы
Ответ 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
Если вы установите его на ленивый, тогда внешняя карта не будет выбирать сотрудника, если это не обязательно. Извлечение показывает, как он будет запрашивать сотрудника, если это необходимо.