2

いくつかのメタデータを含む結合テーブルを使用して、2 つのテーブル間の関係をマップする方法を見つけようとしています。つまり、3 つのテーブルはフォームのページを表し、各ページには任意の数の要素 (質問) を含めることができます。何らかの理由で、元の開発者は要素を複数のフォームで使用できると判断しました。これは、ページ上の要素の順序付けに使用される重み列が結合テーブルにあることを意味します。

ここに画像の説明を入力

これを XML でマップするにはどうすればよいでしょうか。(注釈はオプションではありません。)

結合テーブルについては、次のようになると思います。

<class name="com.foo.bar.model.db.ApplicationPageElements"  
       table="APPLICATION_PAGE_ELEMENTS">
    <composite-id name="id" class="com.foo.bar.model.db.ApplicationPageElementsKey">
        <key-property name="pageId" column="page_id"/>
        <key-property name="elementId" column="element_id"/>
    </composite-id>
    <property name="weight" type="java.lang.Long">
        <column name="WEIGHT" precision="0" />
    </property>
</class>

私の本能では、ApplicationPage 側から次のようなことをしたいと思っています。

<set name="applicationElements" table="applicationPageElement">
    <key column="page_id"/>
    <many-to-many column="element_id" unique="true"
          class="com.foo.bar.model.db.ApplicationElements" />        
</set>

そして、それが私がすべてのたるんだ顎を取得し、画面を見つめ、すすり泣く場所です。

データベースをマップするために .hbm.xml ファイルを使用しています。また、データベースを変更しないことも決定しました。

これを XML でマップする方法についてのアイデアはありますか?

4

1 に答える 1

3

application_pageとapplication_elementの関係を多対多で考えるのではなく、application_pageからApplicationPageElementsへの1対多の関係、およびapplication_elementからApplicationPageElementsへの1対多の関係と考えてください。

application_page xmlマッピングに、次を追加します。

<set name="applicationElements" inverse="true">
    <key column="page_id"/>
    <one-to-many class="ApplicationPageElements"/>
</set>

page_idは、結合テーブルの主キーの一部を形成します。したがって、コレクションを逆としてマークします。

結合テーブルのマッピングは正しいです。ただし、上記の結合テーブルの現在のマッピングを変更すると、application_pageからApplicationPageElementsに移動できます。(ApplicationPageElementsを介して)application_pageからapplication_elementに移動するには、結合テーブルのマッピングに多対1の関係を追加します。

<class name="com.foo.bar.model.db.ApplicationPageElements"  
       table="APPLICATION_PAGE_ELEMENTS">
    <composite-id name="id" class="com.foo.bar.model.db.ApplicationPageElementsKey">
        <key-property name="pageId" column="page_id"/>
        <key-property name="elementId" column="element_id"/>
    </composite-id>
    <property name="weight" type="java.lang.Long">
        <column name="WEIGHT" precision="0" />
    </property>
    <many-to-one name="elements" class="ApplicationElements" 
    column="element_id" not-null="true" insert="false" update="false"/>
    <many-to-one name="page" class="ApplicationPage" 
    column="page_id" not-null="true" insert="false" update="false"/>
</class>

上記の多対1マッピングでは、挿入属性と更新属性がfalseに設定されていることに注意してください。これが必要なのは、列が2回マップされるためです。1回は複合キー(値の挿入を担当)で、もう1回は多対1の関連付けです。

上記のユースケースは、本「Java PersistencewithHibernate」で詳しく説明されています。

于 2012-11-03T14:19:26.340 に答える