【问题标题】:Hibernate use same mapping for multiple tablesHibernate 对多个表使用相同的映射
【发布时间】:2013-11-29 07:49:18
【问题描述】:

我有 2 个相同的数据库实例,其中包含具有相同架构的 FOO_TABLE。所以,目前我每个数据库实例都有一个类定义:

<class name="FooTable" table="FOO_TABLE" entity-name="FooTableInstance1">
  <property name="..." column="..." />
  <property name="..." column="..." />
  ....
</class>

<class name="FooTable" table="FOO_TABLE" entity-name="FooTableInstance2">
  <property name="..." column="..." />
  <property name="..." column="..." />
  ....
</class>

问题是我不想复制粘贴属性,因为表具有相同的架构。是否可以从包含所有映射的基类继承 2 个类,并在 2 个子类中指定不同的实体名称?

【问题讨论】:

    标签: java database hibernate


    【解决方案1】:

    另一种选择(如果我正确理解您的问题,也许是正确的选择)是使用@MappedSuperclass 来定义通用映射。您是使用这个还是之前发布的建议取决于数据模型:例如,这两个实体是否相关,以便您能够跨两个实体进行查询?

    例如select f from Foo 返回所有 Foo1Foo2

    当 Foo 是 MappedSuperclass 时,不能这样做。

    更多详情请看这里:

    【讨论】:

      【解决方案2】:

      是的,这是可能的。看看相关文档:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html

      更具体地说,请查看9.1.5。每个具体类的表。使父类抽象,事情应该可以正常工作。

      根据文档你需要 3 个 Java 类:

      1. Foo(摘要,包含您在两个表中需要的所有字段)
      2. FooChild1(具体,Foo 的子类,不包含新字段)
      3. FooChild2(具体,Foo 的子类,不包含新字段)

      您将需要两张桌子。一个映射到FooChild1,另一个映射到FooChild2

      【讨论】:

      • 我真的需要创建一个抽象类 FooTableBase 并将所有列放在那里吗?然后创建一个空的子类FooTable。 FooTable 将完全为空,因为所有表都具有完全相同的架构。
      • 我知道它看起来是多余的,实际上确实如此。但是在 Hibernate 中映射事物的直接方法是将类映射到 db 表。也许您的用例与 Hibernate 假设不完全匹配。
      • 刚刚意识到解决方案存在误解。您不需要数据库上的空表。再次检查我的答案。我希望现在很清楚。
      • 我想说的是,我在多个数据库实例上复制了 exact 相同的表(表名、表架构等所有内容)。当我想存储一个条目时,我在运行时(从实体名称)选择数据库实例,并将其存储在那里。所以基本上,我有一个跨多个数据库实例分区的大表。创建类的层次结构似乎非常多余。这真的是 Hibernate 的一个非凡用例吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多