问题如下:
产品表。 3 joined-subclasses
: DVD , CD ,预订。
角色表(复合ID:NAME,ROLE,PRODUCT),以及鉴别器列的子类ROLE:actor,director,artist,author等。映射到Actor ,导演,艺术家,作家java课程; (通常我猜)...
图书有作者, CD 艺术家, DVD 演员和导演 - 这些都是通过{{1与set
关系指向项的类,例如作者,导演,艺术家等......它们只是角色的子类(见2。)
只要一个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>
对我来说似乎有些不错,但却抛出异常。 谢谢你的任何想法!
答案 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