Подкритерии гибернации с FetchMode не работают

Я хочу использовать критерии с некоторыми условиями поля "один ко многим".

Кратко представив мою модель, у одного item есть несколько options.
Поскольку я хочу получить item с отфильтрованным options и передать его анализатору JSON (без сеанса), мне нужно получить параметры при запросе.

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

Item item = (Item)session.createCriteria(Item.class)                                        
                .setFetchMode("options", FetchMode.JOIN)
                .add(Restrictions.eq("id", id))
                .uniqueResult();

Но когда я добавил ограничения в options, возникает ошибка (именно, когда вызываемая функция пытается получить доступ к элементу, поиск работает нормально).

Item item = (Item)session.createCriteria(Item.class)
                .setFetchMode("options", FetchMode.JOIN)
                .add(Restrictions.eq("id", id))
                .createCriteria("options").add(Restrictions.eq("status", ItemStatus.ABLE))
                .uniqueResult();

Ошибка:

failed to lazily initialize a collection of role: options, could not initialize proxy - no Session

Я добавил setFetchMode в конец дополнительных критериев, результат был таким же.

Что случилось!? Не могли бы вы сказать решение?


person crazy_rudy    schedule 18.06.2014    source источник
comment
Я попытался удалить .setFetchMode("options", FetchMode.JOIN), тогда я также получаю правильный результат.   -  person Amogh    schedule 18.06.2014
comment
@Amogh поиск данных - это не моя проблема, моя проблема в том, чтобы получить доступ к options после закрытия сеанса.   -  person crazy_rudy    schedule 18.06.2014
comment
@ Возможно, причина, по которой я установил режим выборки, заключается в доступе к options после закрытия сеанса.   -  person crazy_rudy    schedule 18.06.2014
comment
@Amogh, но когда я добавил ограничения на options, произошла ошибка. хотя я установил режим выборки как присоединение к параметрам.   -  person crazy_rudy    schedule 18.06.2014
comment
Настройка режима выборки не используется для доступа к этой ассоциации после закрытия сеанса. В нем рассказывается о том, как извлекается ассоциация.   -  person Amogh    schedule 18.06.2014
comment
Перейдите по этой ссылке community.jboss.org/wiki/AShortPrimerOnFetchingStrategies   -  person Amogh    schedule 18.06.2014
comment
@Amogh, я только что решил эту проблему, добавив аннотацию @Fetch(FetchMode.JOIN) в поле параметров. но меня больше интересует, почему setFetchMode не работает с подкритериями... это не имеет смысла....   -  person crazy_rudy    schedule 18.06.2014


Ответы (1)


Я думаю, вы получаете сообщение об ошибке, когда пытаетесь получить доступ к options после закрытия session. в соответствии с спящими коллекциями по умолчанию загружаются лениво. Если вы хотите получить options вместе с item, вам нужно установить FetchType EAGER (FetchType.EAGER) в файле аннотации или сопоставления, что бы вы ни использовали.

Вы можете попробовать использовать этот код

Item item = (Item)session.createCriteria(Item.class)
            .setFetchMode("options", FetchMode.SELECT)
            .add(Restrictions.eq("id", id))
            .createCriteria("options").add(Restrictions.eq("options.status", ItemStatus.ABLE))
            .uniqueResult();
person Amogh    schedule 18.06.2014
comment
Это не тот ответ, который мне нужен, прежде чем добавлять ограничения с использованием подкритериев, он отлично работает. - person crazy_rudy; 18.06.2014
comment
Вы можете отлаживать свой код. чтобы мы могли узнать, в какой строке вы получаете исключение. Потому что, согласно ошибке, он говорит, что вы пытаетесь загрузить параметры, когда сеанс закрывается, или, возможно, ваша конфигурация управления сеансом настроена на закрытие сеанса при фиксации транзакции. Я сделал то же самое в своем коде, он работает нормально. - person Amogh; 18.06.2014
comment
@ user1372488 да, моя программа обращается к options после закрытия сеанса. поиск данных в обоих случаях в порядке, но моя проблема заключается в том, как получить доступ к options после закрытия сеанса. доступ к options после закрытия сеанса в порядке с первым кодом. потому что он установил режим выборки как соединение. (без настройки режима выборки возникает та же ошибка) но второй код не работает, я просто добавил ограничения на options! - person crazy_rudy; 18.06.2014
comment
status принадлежит option или item? - person Amogh; 18.06.2014
comment
@crazy_rudy Ограничения, добавленные вами для status, будут применяться к псевдониму элемента, а не к опции. Используйте псевдоним для применения к опции, такой как options.status - person Amogh; 18.06.2014