Как я могу получить доступ к лениво загруженным полям после того, как сессия закрылась, использование в спящем режиме?

Нет - ни то, ни другое. Согласно Go для программистов на C ++ документы,

Go не поддерживает перегрузку функций и не поддерживает определяемые пользователем операторы.

Я не могу найти столь же ясное утверждение, что необязательные параметры не поддерживаются, но они также не поддерживаются.

8
задан Paul Adamson 1 July 2009 в 14:08
поделиться

3 ответа

Я делаю некоторые предположения о том, на что смотрит пользователь, но похоже, что вы хотите получить дочерние элементы только в том случае, если пользователь уже просмотрел родительский элемент и действительно хочет их видеть. .

Почему бы не попробовать открыть новый сеанс и получить детей от их родителей? Что-то вроде ...

criteria = session.createCriteria(Child.class);
criteria.add(Restrictions.eq("parent", parent));
List<Child> children = criteria.list();
3
ответ дан 5 December 2019 в 17:40
поделиться

Ленивая коллекция может быть загружена с помощью Hibernate.initialize (parent.getCollection ()), за исключением того, что родительский объект должен быть присоединен к активному сеансу.

Это решение берет родительский объект Entity и имя поля с отложенной загрузкой и возвращает Entity с полностью загруженной коллекцией.

К сожалению, поскольку родительский элемент необходимо повторно подключить к вновь открытому сеансу, я не могу использовать ссылку на отложенную коллекцию как это будет ссылаться на отдельную версию Entity; отсюда fieldName и отражение. По той же причине он должен возвращать присоединенный родительский объект.

Таким образом, в сценарии OP этот вызов может быть сделан, когда пользователь выбирает просмотр ленивой коллекции:

Parent parentWithChildren = dao.initialize(parent,"lazyCollectionName");

Метод:

public Entity initialize(Entity detachedParent,String fieldName) {
    // ...open a hibernate session...
    // reattaches parent to session
    Entity reattachedParent = (Entity) session.merge(detachedParent); 

    // get the field from the entity and initialize it
    Field fieldToInitialize = detachedParent.getClass().getDeclaredField(fieldName);
    fieldToInitialize.setAccessible(true);
    Object objectToInitialize = fieldToInitialize.get(reattachedParent);

    Hibernate.initialize(objectToInitialize);
    return reattachedParent;
}
7
ответ дан 5 December 2019 в 17:40
поделиться

Hibernate обрабатывает коллекции иначе, чем обычные поля.

В моей работе мы обходим это, просто инициализируя поля в начальной загрузке, которые нам нужны в каждом конкретном случае. Например, в методе загрузки фасада, окруженном транзакцией, у вас может быть:

public Parent loadParentWithIntent1(Long parentId)
{
  Parent parent = loadParentFromDAO();

  for (Child c : parent.getChildren())
  {
    c.getField1();
  }
}

и у нас есть разные вызовы фасада для каждого намерения. По сути, это обеспечивает то, что вам нужно, потому что вы будете загружать эти конкретные поля, когда они вам понадобятся, и это просто помещает их в сеанс во время загрузки.

0
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: