将hibernate组件映射到单独的表

时间:2009-09-14 09:33:13

标签: java hibernate

是否可以将Hibernate配置为在单独的表中存储组件类?

采用以下示例:

<class name="test.ClassA">
   <property name="propA"/>
   <component name="componentProp" class="test.ClassB">
      <property name="propB"/>
   </component>
</class>

这会映射到名为MyClass的表格,其中包含两列propApropB。我想要的是将组件的属性映射到名为ClassB的表。

想要做的是将ClassB本身配置为一个实体(它在ClassA之外没有任何有意义的身份),因此排除了正常的关联。另外,我无法修改对象模型(它是生成的代码),因此我无法向ClassB引入ID属性。

这似乎是Hibernate功能的一个缺口 - &lt; component&gt;映射执行“多个类到一个表”,并且&lt; join&gt;做“一类到多表”,但奇怪的是没有明显的方法可以做“多类到多表”,而不需要求助于实体关联。

我想要这样做的理由是,我希望我的数据库模式尽可能地与对象模型相似,并且包括ClassB组件的单独表。我知道这不会扩展 - 例如,你不能做嵌套组件,但在这种特殊情况下这不是问题。

1 个答案:

答案 0 :(得分:7)

可以一起使用<join><component>,还是我误解了您的问题?

<class name="test.ClassA">
  <property name="propA"/>

  <join table="ClassB">
    <key column="ClassA_id" />
    <component name="componentProp" class="test.ClassB">
      <property name="propB"/>
    </component>
  </join>

</class>

虽然您(显然)确实需要外键,但它不必映射到对象模型中。有关加入的详细信息为here - 仅提供完整性,我知道知道从何处获取这些内容: - )

上面链接中的文档没有明确说明在连接中映射组件的任何内容,但是DTD允许它并且我已经在3.1中使用它,所以我很确定它仍然可以正常工作。但是,不知道如何(或是否可能)用注释来映射它。