#java #hibernate #overriding #lazy-loading
#java #переход в режим гибернации #переопределение #отложенная загрузка
Вопрос:
У меня есть файл сопоставления, который устанавливает lazy=false
для некоторых связанных объектов. Это имеет смысл для многих вариантов использования, но есть некоторые исключения. Проблема в том, что я не хочу извлекать связанные ассоциации во время запроса для этих случаев, которые очень дороги по времени.
Пример сопоставления для объекта.
<class name="Category" table="category">
<id name="id" type="string">
<column length="50" name="id"/>
<generator class="uuid"/>
</id>
<property name="name" type="string">
<column length="100" name="name" not-null="true"/>
</property>
<set inverse="true" lazy="false" name="categorySourcesList">
<key>
<column length="50" name="categoryid" not-null="true"/>
</key>
<one-to-many class="CategorySource"/>
</set>
</class>
Мой вопрос в том, есть ли способ переопределить lazy
значение, которое установлено в файле сопоставления, либо в sql-query
I пользовательской записи, либо включить отложенную загрузку в качестве одного из параметров в DAO? или через некоторые аннотации?
Ответ №1:
Да, вы можете переопределить стратегию извлечения аннотированной или отображенной в xml ассоциации.
Criteria criteria = session().createCriteria(MyClass.class);
criteria.add(Restrictions.eq("id", "1234"));
criteria.setFetchMode("children",FetchMode.EAGER);
return (MyClass) criteria.uniqueResult();
Это вернет вам экземпляр MyClass
с готовыми извлечениями его дочерних элементов.
Ответ №2:
AFAIK вы не можете переопределить ускоренную загрузку с помощью LAZY, но только наоборот.
Таким образом, вам нужно будет определить ассоциацию be LAZY и переопределить ее в запросах с использованием объединений. Могут быть другие способы сделать это, но, боюсь, это все, что я знаю прямо сейчас.