Переопределить параметр отложенной загрузки для связанных объектов в файле отображения гибернации

#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 и переопределить ее в запросах с использованием объединений. Могут быть другие способы сделать это, но, боюсь, это все, что я знаю прямо сейчас.