【问题标题】:Hibernate WrongClassException / Sets / Discriminators?Hibernate WrongClassException / Sets / Discriminators?
【发布时间】:2010-11-19 13:46:24
【问题描述】:

问题如下:

  1. 产品表。 3 joined-subclassesDVDCD书籍

  2. Role 表(复合 id:NAME、ROLE、PRODUCT)和按鉴别列 ROLE 的子类:映射到 Actor 的演员、导演、艺术家、作者等,导演,艺术家,作者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>

对我来说似乎还可以,但它会引发异常。 谢谢你的任何想法!

【问题讨论】:

    标签: java hibernate orm set one-to-many


    【解决方案1】:

    我不得不说,这是一个相当深奥的映射。为什么要使用复合键(鉴别器也是其中的一部分)而不是代理?

    这里一个可能的问题是您可能手动将鉴别器值(通过role 属性)设置为给定子类应该设置的值。 Hibernate 将无法覆盖它(鉴别器映射为 insert="false"),这将导致后续选择时出现 WrongClassException。

    也有可能在 media.DVD 扩展的 Product 映射中发生了一些奇怪的事情,而您没有包含该映射。您可以添加它并提供完整的堆栈跟踪吗?

    【讨论】:

      【解决方案2】:

      问题基本上是您的模型没有标准化:您告诉 hibernate 有一个复合键,但您只使用该键的一部分来引用表。

      我认为您可以通过在您的产品中设置一组人员并且每个人都有一个角色来实现这一点,或者通过将每个组映射到带有您的人员表的单独(链接)表。

      另一种更深奥的方法是映射到MultiMap:实际上,您的产品中有Map&lt;Role, Set&lt;Person&gt;&gt;。 Hibernate 不支持这个开箱即用,但I once wrote a UserType for this

      干杯,

      -马丁

      【讨论】:

      • 不知道你从哪里得到的。 OP 正在为子 (Person) 使用复合密钥,父 (media.DVD) 有一个 (IDPRODUCT) 密钥。
      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2022-12-27
      相关资源
      最近更新 更多