В JPA режим выборки указывается для каждого атрибута сохраняемости либо через аннотацию, либо в файле сопоставления xml.
Таким образом, независимый от поставщика JPA способ достижения вашей цели состоит в том, чтобы иметь отдельный файл сопоставления для каждого уровня DAO. К сожалению, для этого потребуется отдельный PersistenceUnit для каждого файла сопоставления, но вы можете, по крайней мере, совместно использовать одни и те же классы сущностей и один и тот же запрос JPQL.
Далее следуют скелеты кода.
постоянство.xml:
<persistence>
<persistence-unit name="dao-eager">
<mapping-file>orm-eager.xml</mapping-file>
</persistence-unit>
<persistence-unit name="dao-lazy">
<mapping-file>orm-lazy.xml</mapping-file>
</persistence-unit>
</persistence>
orm-eager.xml :
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<basic name="name" fetch="EAGER"/>
</attributes>
</entity>
</entity-mappings>
orm-ленивый.xml :
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<basic name="name" fetch="LAZY"/>
</attributes>
</entity>
</entity-mappings>
Тогда это просто вопрос создания EntityManagerFactory для соответствующей единицы персистентности в ваших слоях DAO.
На самом деле вам не нужны два файла сопоставления, вы можете указать либо LAZY, либо EAGER в качестве аннотации в Entity, а затем указать противоположное в файле сопоставления xml (хотя вам все равно понадобятся две единицы сохранения).
Может быть немного больше кода, чем решение Hibernate выше, но ваше приложение должно быть переносимым для других поставщиков JPA.
Кроме того, OpenJPA предоставляет функциональность, аналогичную описанному выше решению Hibernate, с использованием FetchGroups (концепция, заимствованная из JDO).
И последнее предостережение: FetchType.LAZY — это подсказка в JPA, провайдер может загружать строки с готовностью, если это необходимо.
Обновляется по запросу.
Рассмотрим такую сущность:
@Entity
public class ErrorCode {
// . . .
@OneToMany(fetch=FetchType.EAGER) // default fetch is LAZY for Collections
private Collection myCollection;
// . . .
}
В этом случае вам по-прежнему понадобятся две единицы сохраняемости, но вам понадобится только файл orm-lazy.xml. Я изменил имя поля, чтобы отразить более реалистичный сценарий (по умолчанию только коллекции и большие двоичные объекты используют FetchType.LAZY). Таким образом, результирующий файл orm-lazy.xml может выглядеть так:
<entity-mappings>
<entity class="ErrorCode">
<attributes>
<one-to-many name="myCollection" fetch="LAZY"/>
</attributes>
</entity>
</entity-mappings>
И persistence.xml будет выглядеть так:
<persistence>
<persistence-unit name="dao-eager">
<!--
. . .
-->
</persistence-unit>
<persistence-unit name="dao-lazy">
<!--
. . .
-->
<mapping-file>orm-lazy.xml</mapping-file>
</persistence-unit>
</persistence>
person
Mike
schedule
30.06.2009