2015-12-22 1 views
0

Я использую Hibernate в последнее время и нужен, чтобы отобразить темы, которые имеют комментарии, как его внешний ключ (@OneToMany) следующие образом:Список Hibernate без Ленивого объекта

Topic.class

... 
@OneToMany(fetch = FetchType.LAZY, mappedBy = "topic") 
public Set<Comment> getComments() { 
    return this.communityComments; 
} 

... 

Я использую Hibernate Tools чтобы Generat на объекты DAO, который содержит:

public List findByExample(Topic instance) { 
    try { 
     List results = sessionFactory.getCurrentSession() 
       .createCriteria("com.some.models.Topic").add(Example.create(instance)) 
       .list(); 
     return results; 
    } catch (RuntimeException re) { 
     throw re; 
    } 
} 

Когда я получаю темы, используя findByExample, набор тем, будут возвращены. Проблема в том, что как я могу повторить набор? Когда я делаю следующий код:

Set<Topic> oriList = topicDAO.findByExample(OneExample); 
Iterator<Topic> it = oriList.iterator(); 

Он показал исключение «без сеанса». Причина в том, что я думаю, oriList.iterator() попытался получить доступ к ленивому объекту - комментарии.

Есть ли способ решить эту проблему с минимальными изменениями?

Или можно каким-либо образом установить все комментарии к null без использования итератора?

+2

минимальные изменения будут, чтобы сделать их не лень ... 'FetchType.EAGER' – Coderchu

+0

есть отличный блог по этому конкретному вопросу, вы можете посмотреть на него здесь HTTP: //javarevisited.blogspot. in/2014/04/orghibernatelazyinitializationException-Could-not-initialize-proxy-no-session-hibernate-java.html В нем обсуждается как простое, так и оптимальное решение – Vihar

+0

Вы также можете настроить режим выборки для сбора комментариев в запросе критериев setFetchMode ("communityComments", FetchMode.EAGER). Это будет отменять ленивую выборку в запросе критериев. – akki

ответ

0

Здесь ваша проблема заключается в получении сеанса.

Вы должны попробовать openSession, а не getCurrentSession.

public List findByExample(Topic instance) { 
    try { 
     List results = sessionFactory.openSession() 
       .createCriteria("com.some.models.Topic").add(Example.create(instance)) 
       .list(); 
     return results; 
    } catch (RuntimeException re) { 
     throw re; 
    } 
} 
+0

@Steven Luo: Мой ответ работал на вас? –