0

問題は次のようになります。

  1. 製品テーブル。3 joined-subclassesDVDCD

  2. ロールテーブル(複合ID:NAME、ROLE、PRODUCT)、およびディスクリミネーター列によるサブクラスROLE:Actor、Director、Artist、Authorjavaクラスにマップされるactor、director、artist、authorなど。(かなり普通だと思います)..。

  3. 本には、著者、CDアーティスト、DVD俳優、監督がいます。これらはすべて、役割のサブクラスである、アイテムのクラス(たとえば、作家、監督、アーティストなど)を指す関係でモデル化されてます(2を参照)。。)setone-to-many

結合されたサブクラスに(人/ロールの)そのようなセットが1つしかない限り、すべて正常に機能します。しかし、 DVD 、俳優、監督のように2つある場合、HibernateはWrongClassExceptionをスローしますか?

XMLの抜粋(Product.hbm.xml):

<joined-subclass name="media.DVD" table="V_DVD"  lazy="false">

    <key column="IDPRODUCT"/>
    <property column="FORMAT" name="format" type="string"/>

    ...
    <set name="actors" lazy="false">
       <key column="IDPRODUCT"/>
       <one-to-many class="media.DVD$Actor"/>
    </set>

    <set name="directors" lazy="false">
       <key column="IDPRODUCT"/>
       <one-to-many class="media.DVD$Director"/>
    </set>
    ...
</joined-subclass>

XML(Person.hbm.xml):

<class name="media.Person" table="V_ROLE">
    <composite-id>
        <key-property column="NAME" name="name" type="string"/>
        <key-property column="ROLE" name="role" type="string"/>
        <key-many-to-one class="media.Product" column="IDPRODUCT" 
          name="product"/>
    </composite-id>

    <discriminator column="ROLE" insert="false" type="string"/>

    <property name="name"/>
    <property name="role"/>

    <many-to-one class="media.Product" column="IDPRODUCT" 
      insert="false" name="product" update="false"/>

    <subclass discriminator-value="author" name="media.Book$Author"/>
    <subclass discriminator-value="artist" name="media.Music$Artist"/>
    <subclass discriminator-value="creator" name="media.DVD$Creator"/>
    <subclass discriminator-value="director" name="media.DVD$Director"/>
    <subclass discriminator-value="actor" name="media.DVD$Actor"/>

</class>

それは私にはいくぶん大丈夫のようですが、それでも例外をスローします。アイデアありがとうございます!

4

2 に答える 2

0

問題は基本的に、モデルが正規化されていないことです。複合キーがあることを hibernate に伝えますが、そのキーの一部のみを使用してテーブルを参照します。

これを実装するには、製品に一連の人物を配置し、各人物に役割を持たせるか、各セットを個別の (リンク) テーブルに人物テーブルにマッピングすることで実装できると思います。

別のより難解なアプローチは、 a にマップするMultiMapことです: 実際Map<Role, Set<Person>>、製品には a があります。Hibernate はそのままではこれをサポートしていませんが、私はかつて this の UserType を書きました

乾杯、

-マールテン

于 2009-08-14T20:02:18.320 に答える
0

私は言わなければならない、これはかなり難解なマッピングです。サロゲートの代わりに複合キーを使用しているのはなぜですか (ディスクリミネーターもその一部です)。

roleここで考えられる問題の 1 つは、(プロパティを介して) 識別子の値を、特定のサブクラスに対してあるべき値以外の値に手動で設定している可能性があることです。Hibernate はそれを上書きできず (discriminator は insert="false" でマップされます)、これにより後続の select で WrongClassException が発生します。

Productまた、media.DVD の拡張元であり、含めなかったマッピングで何かファンキーなことが起こっている可能性もあります。それを追加して、完全なスタック トレースを提供できますか?

于 2009-08-14T17:50:27.087 に答える