Как я могу использовать нетерпеливую экземпляр в Hibernate?
-
27-10-2019 - |
Вопрос
<!-- 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
Я нашел ответ. Он должен добавить к установочному объявлению в XML свойство lazy="false"
Другие советы
Инициализировать набор элементов внутри listAndCast(Query q)
метод перед возвращением или вызовом transaction.commit()
. Анкет Это может быть сделано, позвонив по любому из аксессов на элементе из набора элементов. Это заставит Hibernate инициализировать набор элементов, а не возвращать список прокси.
РЕДАКТИРОВАТЬ
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;
Не связан с StackOverflow