9

これはかなり初歩的な問題であることはわかっていますが、1) 私は Hibernate に比較的慣れていないため、2) 私が見つけた修正はここには適用されません (適用されるようです)。

これが私が得ている例外です:

org.hibernate.MappingException: テーブル POSTS からの関連付けが参照しています
 マップされていないクラス: com.beans.User at
 org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1285)

これは、Hibernate が自身を構成しようとしたときに発生します。

私が扱っているオブジェクトは、Users、Posts (抽象的なスーパークラス)、Statuses、および Comments (Post の具体的なサブクラス) です。それぞれは、2 つのテーブル (USERS と POSTS) のいずれかの Bean です。User オブジェクトは非常に平凡です: ユーザーを説明する当たり障りのないフィールドがたくさんあります。同様に退屈なフィールドに加えて、ステータスとコメントの両方に所有者 (投稿したユーザー) がいます。ステータスとコメントの違いは、ステータスにはコメントのリストを添付できますが、親はありませんが、コメントには子の投稿はありませんが、親はあります (はい、これは基本的に Facebook です)。

私が読んだことから、問題は多対一のマッピングにあるようですが、何か問題があるようには見えません。ここに私が使用している3つの構成ファイルがあります。

hibernate.cfg.xml:

<休止状態の構成>
    <セッションファクトリー>
        ...
        <!-- マッピングされた持続性クラス -->
        <mapping resource="User.hbm.xml" />
        <mapping resource="Post.hbm.xml" />
    </セッションファクトリー>
</休止状態の構成>

User.hbm.xml:

<休止状態のマッピング>
    <class name="com.beans.User" entity-name="User" table="USERS" proxy="User">
        <id name="uid" type="java.lang.Integer">
            <列名="uid" />
            <generator class="assigned" />
        </id>
        ...
    </クラス>
</hibernate-mapping>

Post.hbm.xml:

<hibernate-mapping>
    <class name="com.beans.Post" entity-name="Post" table="POSTS" proxy="Post" abstract="true">
        <id name="pid" type="java.lang.Integer">
            <column name="pid" />
            <generator class="assigned" />
        </id>            
        <discriminator column="type" />
        <one-to-one name="parent" class="com.beans.Post"></one-to-one>
        <many-to-one name="owner" class="com.beans.User" update="false" fetch="select">
            <column name="owner" />
        </many-to-one>
        <property name="postDate" type="java.sql.Timestamp" update="false">
            <column name="post_date" />
        </property>
        <property name="content" type="java.lang.String" update="false">
        <column name="content" />
        </property>
        <property name="type" type="string" update="false">
         <column name="type" />
        </property>

        <subclass name="com.beans.Status" discriminator-value="status">
         <list name="children" inverse="false" table="POSTS" lazy="true">
                <key column="pid" />
             <index />
             <one-to-many class="com.beans.Comment" />
     </list>
        </subclass>

        <subclass name="com.beans.Comment" discriminator-value="comment"></subclass> 
    </class>
</hibernate-mapping>

Status に Comment の ArrayList が含まれているという事実をどこかに指定する必要があるような気がしますが、それは Post.hbm.xml ファイルの「リスト」構造によって暗黙的に行われているのではないでしょうか?

xml ファイルはクラスパス (WEB-INF/classes) に存在し、.java ファイル自体もアプリケーションに表示されます。洞察をいただければ幸いです。

4

2 に答える 2

18

<class>投稿した例外は、宣言でエンティティ名を明示的に指定し、で指定しなかったことが原因です<many-to-one>。エンティティ名は、同じクラスに基づく異なるマッピングを区別するために使用される特別な属性です。マッピングには必要ありません。

とはいえ、マッピングには複数の追加の問題があります。

  1. <one-to-one>親のマッピングが間違っています。定義上、1対1にすることはできません。この投稿には1つの親しかありませんが、別の投稿には同じ親があり(特にコメントの場合)、親の関連付けの終わりが1対多になります。代わりにマップする必要があります<many-to-one>
  2. コメントのリストは、インデックスを維持するための特別な列がない限り、実際にはリストではありません(空の宣言と無効な<index/>宣言で判断することはありません)。<bag>代わりにマップしてください。
  3. コメントリストは、実際にはinverse=trueでマップする必要があります。
  4. それ自体は問題ではありませんが、マッピングが読みにくくなります。ネストされた<column>要素は必要ありません。代わりに属性として使用することも、列名がプロパティ名と一致する場合は完全にスキップすることもできます。同様に、どこにでもupdate = falseを設定しても意味がありません。投稿を更新したくない場合は、保存しないでください:-)
于 2009-10-14T05:40:17.997 に答える
2

私にとって、この問題は、プロパティをマッピングするのではなく参照しようとしたことが原因でした。

流暢な構文では、私はこれを行っていました (間違っています!)。

mapping.References(x => x.AdvertExpiryDays).Not.Nullable();

これではなく(正解!)。

mapping.Map(x => x.AdvertExpiryDays).Not.Nullable();

AdvertExpiryDays はエンティティではなく int でした。

于 2012-07-20T13:02:51.650 に答える