[英]Hibernate WrongClassException / Sets / Discriminators?
問題看起來像這樣:
產品表。 3個joined-subclasses
: DVD , CD , Book 。
角色表(復合ID:NAME,ROLE,PRODUCT)和按區分符列ROLE划分的子類:演員,導演,藝術家,作者等。它們映射到演員,導演,藝術家,作者Java類; (我猜很平常)...
一本書中有作者, 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.