Hibernate WrongClassException / Sets / Discriminators?

时间:2009-08-14 07:17:19

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

问题如下:

  1. 产品表。 3 joined-subclasses DVD CD 预订

  2. 角色表(复合ID:NAME,ROLE,PRODUCT),以及鉴别器列的子类ROLE:actor,director,artist,author等。映射到Actor ,导演,艺术家,作家java课程; (通常我猜)...

  3. 图书有作者, CD 艺术家, DVD 演员和导演 - 这些都是通过{{1与set关系指向项的类,例如作者,导演,艺术家等......它们只是角色的子类(见2。)

  4. 只要一个join-subclass只有一个这样的(人/角色)集合,一切正常。但是当它有两个,比如 DVD ,演员和导演时,Hibernate会抛出一个WrongClassException?

    XML摘录(Product.hbm.xml):

    one-to-many

    XML(Person.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>
    

    对我来说似乎有些不错,但却抛出异常。 谢谢你的任何想法!

2 个答案:

答案 0 :(得分:0)

我必须说,这是一个相当深奥的映射。你为什么使用复合键(鉴别器不是更少的一部分)而不是代理?

这里可能存在的一个问题是,您可能会手动将鉴别器值(通过role属性)设置为给定子类以外的值。 Hibernate将无法覆盖它(discriminator与insert =“false”映射),这会在后续select中导致WrongClassException。

有可能在Product映射中出现了一些时髦的东西,media.DVD扩展了这个映射,而你没有包含它。你可以添加它以及提供完整的堆栈跟踪吗?

答案 1 :(得分:0)

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

我认为您可以通过在您的产品中拥有一组人员并且每个人都有角色,或者通过将每个集合映射到与您的人员表相对应的单独(链接)表来实现此目的。

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

干杯,

-Maarten