0
<!-- 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 クラスのフィールドが入力されていることですが、項目セットを入力したいのですが、どうすればそれを行うことができますか?

4

2 に答える 2

1

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;
于 2011-05-02T19:11:40.983 に答える
0

答えが見つかりました。XML の set 宣言にプロパティを追加する必要があります。 lazy="false"

于 2011-05-04T12:27:34.897 に答える