簡體   English   中英

如何在 Hibernate 中使用急切的實例化?

[英]How do I use eager Instantiation in Hibernate?

<!-- 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>

那是我的映射 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)

但問題是 Proiet class 的字段已填充,但我得到此異常的項目集除外,但我希望填充項目集。我該怎么做?

在返回或調用transaction.commit()之前初始化listAndCast(Query q)方法中的項目集。 這可以通過調用項目集中的元素上的任何訪問器來完成。 這將強制 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;

我找到了答案。它需要在 XML 的集合聲明中添加屬性lazy="false"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM