0

私はHibernateの初心者です。本当に私を夢中にさせる以下のエラーのデバッグを手伝ってくれることを願っています。

CONTENT_WORKGROUP_ROLE という別のテーブルにマップされる CONTENT_WORKGROUP というテーブルを取得しました。以下は、テーブル構造とサンプル データです。

CONTENT_WORKGROUP

  1. CM_WORKGROUP_ID NUMBER(15,0)
  2. WORKGROUP_ID NUMBER(15,0)
  3. ROLE_ID VARCHAR2(20バイト)

CONTENT_WORKGROUP_ROLE

  1. CM_WORKGROUP_ROLE_ID NUMBER(15,0)
  2. ROLE_ID VARCHAR2(20バイト)
  3. FUNCTION_ID VARCHAR2(40バイト)

P/S: 1 つのユーザー ワークグループが複数の役割 (作成者、管理者、承認者) を持つことができます。このワークグループで実行できる機能(追加、編集、削除)は、CONTENT_WORKGROUP_ROLE からクエリできます。

サンプルデータ:

CONTENT_WORKGROUP

CM_WORKGROUP_ID WORKGROUP_ID ROLE_ID
1 136 作成者
2 137 管理者
3 136 管理者

CONTENT_WORKGROUP_ROLE

CM_WORKGROUP_ROLE_ID ROLE_ID FUNCTION_ID

1 作成者 コピー
2 作成者 編集
3 作成者 削除
4 作成者 追加
5 管理者 編集
6 管理者 承認
7 管理者 拒否

ただし、特定のワークグループが保持する ContentWorkgroupRole の SET を取得すると、エラーが発生します。

[11/23/10 15:28:56:053 SGT] 00000039 SystemOut O [23/11/2010 15:28:56.053] エラー JDBCExceptionReporter - ORA-01722: 無効な番号

[11/23/10 15:28:56:100 SGT] 00000039 ServletWrappe E SRVE0068E: サーブレットのサービス メソッドの 1 つでキャッチされない例外がスローされました: アクション。スローされた例外: javax.servlet.ServletException: コレクションを初期化できませんでした: [corp.celcom.next.infochannel.model.ContentWorkgroup.contentWorkgroupRole#1]

以下は、私の休止状態のマッピング ファイルです: ContentWorkgroup.hbm.xml

<hibernate-mapping>
<class name="corp.celcom.next.infochannel.model.ContentWorkgroup" table="CM_WORKGROUP" >
    <id name="cmWorkgroupId" type="long">
        <column name="CM_WORKGROUP_ID" precision="15" scale="0" />

CM_WORKGROUP CM_WORKGROUP_ID

ContentWorkgroupRole.hbm.xml

<hibernate-mapping>
<class name="corp.celcom.next.infochannel.model.ContentWorkgroupRole" table="CM_WORKGROUP_ROLE" >
 <id name="cmWorkgroupRoleId" type="long">

CM_WORKGROUP_ROLE_ID CM_WORKGROUP_ROLE

    <many-to-one name="contentWorkgroup" class="corp.celcom.next.infochannel.model.ContentWorkgroup" fetch="select">
        <column name="ROLE_ID" precision="15" scale="0" />
    </many-to-one>

私の ACTION クラスでは、上記のエラーが次の行で発生しました: Iterator iter = cw.getContentWorkgroupRole().iterator();

for(ContentWorkgroup cw : contentWorkgroupList) { Iterator iter = cw.getContentWorkgroupRole().iterator();

    while (iter.hasNext()) {

          ContentWorkgroupRole role = (ContentWorkgroupRole) iter.next();

  if (role.getFunctionId().equalsIgnoreCase(Constant.ADD))

myForm.setAllowAdd(true); if (role.getFunctionId().equalsIgnoreCase(Constant.EDIT)) myForm.setAllowEdit(true); if (role.getFunctionId().equalsIgnoreCase(Constant.DELETE)) myForm.setAllowDelete(true); } }

奇妙な部分は、文字列を使用する代わりに、ROLE_ID を Integer/Long (つまり、1-Creator、2-Administrator) に変更すると、正常に動作することです! コードの問題の理由と内容を理解できませんでした。

助けてくれてありがとう。このエラーに対処するのに、すでに 1 日かかりました。ありがとう!

4

1 に答える 1

0

申し訳ありませんが、ディスプレイに少し問題があるようです。ここにもう一度書きます:

ContentWorkgroup.hbm.xml

<hibernate-mapping>
<class name="corp.celcom.next.infochannel.model.ContentWorkgroup" table="CM_WORKGROUP" >
    <id name="cmWorkgroupId" type="long">
        <column name="CM_WORKGROUP_ID" precision="15" scale="0" />
        <generator class="corp.celcom.next.util.MultipleTableGenerator" >
            <param name="KEYTABLE_VALUE">CM_WORKGROUP</param>
            <param name="KEYCOLUMN_VALUE">CM_WORKGROUP_ID</param>
        </generator>
    </id>
    <property name="workgroupId" type="long">
        <column name="WORKGROUP_ID" precision="15" scale="0" not-null="true" />
    </property>
    <property name="srId" type="string">
        <column name="SR_ID" length="15" not-null="true" />
    </property>
    <property name="contentCategoryId" type="string">
        <column name="CONTENT_CATEGORY_ID" length="40" not-null="true" />
    </property>
    <property name="roleId" type="string">
        <column name="ROLE_ID" length="20" not-null="true" />
    </property>
    <set name="contentWorkgroupRole" table="CM_WORKGROUP_ROLE" inverse="true">
        <key>
            <column name="ROLE_ID" length="20" not-null="true" />
        </key>
        <one-to-many class="corp.celcom.next.infochannel.model.ContentWorkgroupRole" />
    </set>        
</class>

ContentWorkgroupRole.hbm.xml

<hibernate-mapping>
<class name="corp.celcom.next.infochannel.model.ContentWorkgroupRole" table="CM_WORKGROUP_ROLE" >
    <id name="cmWorkgroupRoleId" type="long">
        <column name="CM_WORKGROUP_ROLE_ID" precision="15" scale="0" />
        <generator class="corp.celcom.next.util.MultipleTableGenerator">
            <param name="KEYCOLUMN_VALUE">CM_WORKGROUP_ROLE_ID</param>
            <param name="KEYTABLE_VALUE">CM_WORKGROUP_ROLE</param>
        </generator>
    </id>

    <many-to-one name="contentWorkgroup" class="corp.celcom.next.infochannel.model.ContentWorkgroup" fetch="select">
        <column name="ROLE_ID" precision="15" scale="0" />
    </many-to-one>

    <property name="menuId" type="string">
        <column name="MENU_ID" length="40" not-null="true" />
    </property>
    <property name="functionId" type="string">
        <column name="FUNCTION_ID" length="40" not-null="true" />
    </property> 

私の ACTION クラスでは、上記のエラーが次の行で発生しました: Iterator iter = cw.getContentWorkgroupRole().iterator();

for(ContentWorkgroup cw : contentWorkgroupList)
{
    Iterator iter = cw.getContentWorkgroupRole().iterator();

    while (iter.hasNext()) {

     ContentWorkgroupRole role = (ContentWorkgroupRole) iter.next();

     if (role.getFunctionId().equalsIgnoreCase(Constant.ADD))
        myForm.setAllowAdd(true);
     if (role.getFunctionId().equalsIgnoreCase(Constant.EDIT))
        myForm.setAllowEdit(true);
     if (role.getFunctionId().equalsIgnoreCase(Constant.DELETE))
        myForm.setAllowDelete(true);
 }
}
于 2010-11-23T08:45:04.380 に答える