2016-03-07 4 views
3

У меня есть класс Session, который имеет отображенный коллекцию Фото объектов:Hibernate: Невозможно охотно принести коллекцию детской коллекции детской

@OneToMany(fetch = FetchType.EAGER) 
@Fetch(FetchMode.SUBSELECT) 
@JoinColumn(name = "sessionId", insertable = false, updatable = false) 
private SortedSet<Photo> photos = new TreeSet<>(); 

Каждая фотография в свою очередь, имеет коллекцию Комментарий объектов, что обозначенный как FetchType.LAZY (потому что я не всегда хочу их):

@OneToMany(cascade = CascadeType.DETACH, fetch = FetchType.LAZY) 
@BatchSize(size=20) 
@Fetch(FetchMode.SUBSELECT) 
@JoinColumn(name = "photoId", insertable = false, updatable = false) 
private SortedSet<Comment> comments = new TreeSet<>(); 

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

Criteria criteria = hibSession.createCriteria(Session.class, "s") 
    .createAlias("photos", "p") 
    .setFetchMode("p.comments", FetchMode.JOIN); 

Но это не так. Вызов photo.getComments() на любом из возвращенных подсайтов фотографий вызывает LazyInitializationException.

Если я (все еще входит в область первоначальной сессии гибернации), перебираем все сеансы и внутри них все фотографии и вызываем photo.getComments().size(), которые будут получать комментарии (в партиях, как указано).

Но есть ли способ рассказать первоначальный запрос, чтобы просто с нетерпением получить все Комментарии в первый раз, без необходимости повторять итерацию?

Спасибо.

+0

Не уверен, если это будет работать или то, что вы хотите, но есть вы пытались использовать HQL для этого конкретного запроса? Вы можете напрямую поместить соединение в запрос. – Asoub

+0

Какую версию Hibernate вы используете? –

+0

Извините - следовало бы упомянуть. Это 4.3.6. – rweiser

ответ

0

Это, вероятно, хорошо известно Hibernate ошибка HHH-3524, setFetchMode не работает, как ожидалось в Criteria запросов. Он был закрыт как черновая проблема, но некоторые пользователи сообщают об этом для версий Hibernate 4.x.x.

Чтобы исправить это можно использовать HQL, так как он работает правильно:

session.createQuery("SELECT s FROM PhotoSession s " + 
    "JOIN FETCH s.photos p " + 
    "JOIN FETCH p.comments"); 

Или использовать обходной путь решения с createCriteria(associationPath, JoinType.LEFT_OUTER_JOIN):

Criteria criteria = session.createCriteria(PhotoSession.class, "s"); 
criteria.createAlias("photos", "p"); 
criteria.createCriteria("p.comments", "c", JoinType.LEFT_OUTER_JOIN); 
criteria.setFetchMode("c", FetchMode.JOIN); 
Смежные вопросы