Как мне использовать нетерпеливую инстанцию ​​в Hibernate? - PullRequest
0 голосов
/ 02 мая 2011
<!-- Clasa Proiect-->
<class catalog="tema3" name="com.tema3.tables.Proiect" table="proiect" lazy="false">
    <id column="proiect_id" name="id">
        <generator class="native"/>
    </id>
    <property name="nume"  type="text" />

    <set name="itemList" table="proiect_item" fetch="select">
        <key column="proiect_id"/>
        <many-to-many column="item_id" unique="true" class="com.tema3.tables.Item"/>
    </set>
</class>    </class>

это мой класс картирования.
код, который я называю экземпляром:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
 Query q = session.createQuery("from Proiect");
 List<Proiect> lists = HibernateUtil.listAndCast(q);
 session.getTransaction().commit();
 obj = lists;

и это listandCastMethod:

public static <T> List<T> listAndCast(Query q) {
    @SuppressWarnings("unchecked")
    List list = q.list();
    return list;
}

И я продолжаю получать:

May 2, 2011 4:38:03 PM org.hibernate.LazyInitializationException <init>
SEVERE: failed to lazily initialize a collection of role: com.tema3.tables.Proiect.itemList, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tema3.tables.Proiect.itemList, no session or session was closed
 at   org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)

но дело в том, что поля класса Proiect заполняются, кроме набора предметов, где я получаю это исключение, но я хочу, чтобы набор предметов был заполнен. Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Инициализируйте набор элементов внутри метода listAndCast(Query q) перед возвратом или вызовом transaction.commit().Это можно сделать, вызвав любой из методов доступа к элементу из набора элементов.Это заставит hibernate инициализировать набор элементов, а не возвращать список прокси.

EDIT

 Session session = HibernateUtil.getSessionFactory().getCurrentSession();
 session.beginTransaction();
 Query q = session.createQuery("from Proiect");
 List<Project> lists = HibernateUtil.listAndCast(q);
 if(lists != null && lists.size() > 0) {
    Set<Item> s = lists.get(0).getItemList();
    Iterator iter = s.iterator();
    while(iter.hasNext()) {
       Item item = iter.next();
       item.getSomething();
       break;
    }
 }
 session.getTransaction().commit();
 obj = lists;
0 голосов
/ 04 мая 2011

Я нашел ответ. Необходимо добавить к объявлению набора в XML свойство lazy="false"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...