Hibernate 4.3.5 DetachedCriteria не получает ленивый список

У меня есть простой запрос, который хорошо сработал, теперь я изменил кое-что в своем коде на:
(hibernate.cfg.xml)

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>

и следующий код:

public UserEn findByIDFetch(Long id, String... fetches) {
    beginTransaction();

    DetachedCriteria dc = DetachedCriteria.forClass(UserEn.class);
    for (String fetch : fetches) {
        dc.createAlias(fetch, fetch, JoinType.INNER_JOIN);
    }

    dc.add(Restrictions.eq("id", id));

    UserEn result = (UserEn) dc.getExecutableCriteria(getSession()).uniqueResult();
    commitTransaction();
    return result;
}

после фиксации у объекта результата не загружен список (который поступает из fetches)
если я делаю result.getAnyList().size(); перед фиксацией, он также загружается, если я использую HQL, он работает отлично. (но это не то, как он должен работать (пусть он открывается и загружается, когда используется), createAlias ​​должен работать нормально, как всегда)

Похоже, что createAlias ​​DetachedCriteria не получает заданный путь (в данном случае characterEnList)

@EDIT
Я обнаружил, что если я использую setFetchMode в желаемом пути (в данном случае characterEnList), выборка работает, но если я использую createAlias (как обычно), она просто перестает работать, я не Не знаю как, возможно, ошибка спящего режима или что-то в этом роде, в любом случае я подожду, пока кто-нибудь ответит, может быть, у кого-то была такая же проблема ...


person Simego    schedule 17.06.2014    source источник
comment
Верните результат на уровень сервиса. В той же транзакции доступа список и спящий режим должны автоматически заполнить список за вас.   -  person JamesENL    schedule 18.06.2014
comment
список используется только в представлении, вне транзакции, createAlias ​​или setFetchMode должны были работать (по крайней мере, это было до использования ThreadLocalSessionContext)   -  person Simego    schedule 18.06.2014


Ответы (2)


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

или, конечно, сделать это нетерпеливым.

person NimChimpsky    schedule 18.06.2014
comment
ну, если вы join fetch это, вам не нужен доступ, чтобы сделать его доступным, поэтому он называется сборкой соединений (например, HQL), DetachedCriteria делает то же самое, он всегда работал, он просто переставал работать без причины, DetachedCriteria перестала загружаться выборка псевдонимов (всегда это делала и всегда работала, просто посмотрите на вопрос), основная проблема возникла после того, как я начал использовать session context как thread (ThreadLocalSessionContext) - person Simego; 18.06.2014

Обнаружена та же проблема, что и следующая: https://hibernate.atlassian.net/browse/HHH-7842 Это, вероятно, ошибка, если я прошу это внутреннее соединение в псевдониме, так и должно быть, я могу сделать это с помощью HQL, почему я не могу сделать это с критериями?

Итак, теперь мне придется использовать тип LEFT_OUTER_JOIN для решения этой проблемы или вообще не использовать псевдоним (если мне не нужно создавать предложение where или двухуровневую выборку)

Надеюсь, это кому-то поможет, спасибо за вашу помощь!

пример

dc.createAlias(fetch, fetch, JoinType.LEFT_OUTER_JOIN);

OR

dc.setFetchMode(fetch, FetchMode.JOIN);
person Community    schedule 20.06.2014