1

こんにちは、複合キーと関連オブジェクトを持つエンティティ モデルがあります。以下は、そのための hbm.xml です。

<hibernate-mapping>
<class name="com.mytrits.admin.Mtmdmsgqna" table="mtmdmsgqna" catalog="mtmdadmin">
    <composite-id name="id" class="com.mytrits.admin.MtmdmsgqnaId">
        <key-property name="messageId" type="int">
            <column name="MessageId" />
        </key-property>
        <key-property name="qserialNo" type="java.lang.Integer">
            <column name="QSerialNo" />
        </key-property>
        <key-property name="qsenderId" type="java.lang.Integer">
            <column name="QSenderID" />
        </key-property>
        <key-property name="qtext" type="string">
            <column name="QText" length="1000" />
        </key-property>
        <key-property name="aserialNo" type="java.lang.Integer">
            <column name="ASerialNo" />
        </key-property>
        <key-property name="asenderId" type="java.lang.Integer">
            <column name="ASenderID" />
        </key-property>
        <key-property name="atext" type="string">
            <column name="AText" length="1000" />
        </key-property>
    </composite-id>
    <many-to-one name="mtmduser" class="com.mytrits.admin.Mtmduser" update="false" insert="false" fetch="select">
        <column name="QSenderID" />
    </many-to-one>
    <many-to-one name="mtmdmessages" class="com.mytrits.admin.Mtmdmessages" update="false" insert="false" fetch="select">
        <column name="MessageId" not-null="true" />
    </many-to-one>
</class>

私はnamedQueryを使用してリストを取得しています。以下はクエリです

<query name="getQNAforMsg">
    <![CDATA[from Mtmdmsgqna where messageId = :msgId order by qserialNo, aserialNo]]>
</query>

私の管理対象 Bean では、リストを反復処理しようとしていますが、NullPointerException が発生します。エンティティのリストには size() > 0 がありますが、(同じセッションで) オブジェクトにアクセスしようとすると失敗し、NullPointerException が返されます。リストからフェッチされた最初のオブジェクトは、それ自体が NULL です。以下は私のBeanコードです

private void buildQATree() {
    try {
        MtmdmsgqnaHome qnasHome = new MtmdmsgqnaHome();
        HibernateUtil.beginTransaction();
        qnaList = qnasHome.findQNAbyMsg(messageId.intValue());
        Iterator it = qnaList.iterator();
        while (it.hasNext()) {
            Mtmdmsgqna mqna = (Mtmdmsgqna) it.next();
            mqna.getId().getMessageId();
            System.out.println("Success");
        }
        HibernateUtil.commitTransaction();
    } catch (Exception ex) {
        if (HibernateUtil.isTransactionActive()) HibernateUtil.rollbackTransaction();
        log.error("Exception fetching Entity Types"+ex);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Getting Message Detail", "Error Getting Message Detail"));          
    }               
}

プロジェクトの別の部分で同様のケースがありますが、同様のコードで問題はありません。ここで何が問題なのかわかりません。次の方法を繰り返し試しましたが、同じ問題が発生します。

/*          
        for (Mtmdmsgqna mqna : qnaList) {
            Hibernate.initialize(mqna);
            Hibernate.initialize(mqna.getId());
            Hibernate.initialize(mqna.getMtmduser());
        }

*/

/*
        for (int i = 0; i < qnaList.size(); i++) {
            Hibernate.initialize(qnaList.get(i));
            Hibernate.initialize(qnaList.get(i).getId());
            Hibernate.initialize(qnaList.get(i).getMtmduser());
        }

*/

複合キーはそれ自体が別のクラスであるため、(Lazy = 'true'として)フェッチされていないと思います。また、多対1以外の要素がないため、熱心にフェッチされるものはありません。したがって、DB にデータがあっても、オブジェクトは null です。メイン エンティティ オブジェクト自体が null であるため、初期化のために関連オブジェクトをさらにナビゲートすることはできません。少なくとも複合 ID データを熱心に取得する必要があると思います。私は Hibernate の初心者であり、hbm ファイルの複合キーに lazy-eager 属性を設定する方法が見つかりませんでした。それが可能かどうか教えてください。また、他に問題になる可能性がある場合はお知らせください。どんな助けでも素晴らしいでしょう。

4

0 に答える 0