簡體   English   中英

休眠WrongClassException /集/鑒別符?

[英]Hibernate WrongClassException / Sets / Discriminators?

問題看起來像這樣:

  1. 產品表。 3個joined-subclassesDVDCDBook

  2. 角色表(復合ID:NAME,ROLE,PRODUCT)和按區分符列ROLE划分的子類:演員,導演,藝術家,作者等。它們映射到演員,導演,藝術家,作者Java類; (我猜很平常)...

  3. 本書中有作者, CD藝術家, DVD演員和導演-這些都是通過set建模的,指向一組項目one-to-many關系,例如作者,導演,藝術家等。角色的子類(請參閱2。)

只要一個聯接子類只有一組這樣的(人員/角色),那么所有這些都可以正常工作。 但是,當它有兩個像DVD ,演員和導演一樣時,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>

對我來說似乎還可以,但是會引發異常。 謝謝您的任何想法!

我必須說,這是一個比較深奧的映射。 為什么要使用組合鍵(標識符也是其中的一部分)而不是替代鍵?

這里一個可能的問題是,您可能要手動將鑒別值(通過role屬性)設置為不同於給定子類應有的值。 Hibernate將無法覆蓋它(區分符與insert =“ false”映射),這將在隨后的選擇中導致WrongClassException。

Product映射中可能還會發生一些時髦的事情,media.DVD可以從該映射中擴展出來,而您沒有包含。 您可以添加它並提供完整的堆棧跟蹤嗎?

問題基本上是模型沒有被規范化:您告訴hibernate有一個組合鍵,但是您僅使用該鍵的一部分來引用表。

我認為您可以通過以下方式來實現此目的:在產品中擁有一組人員,每個人都扮演一個角色,或者通過將每個組映射到人員表中的單獨(鏈接)表。

另一個更深奧的方法是映射到MultiMap :實際上,您的產品中具有Map<Role, Set<Person>> Hibernate不支持此功能,但是我曾經為此編寫了一個UserType

干杯,

-馬丁

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM