【问题标题】:Generating Hibernate composite key object from hbm file从 hbm 文件生成 Hibernate 复合键对象
【发布时间】:2010-07-15 13:05:54
【问题描述】:

(括号里的咆哮:)我是一个 Hibernate 初学者,对我可以在 15 秒内用 SQL 编写的简单连接的开销感到有些沮丧。 (结束咆哮)

情况是这样的:我有 2 个表,它们都包含相同的复合主键 - 我们将两个表中的列称为“ID”和“版本”。我需要两个表中关于特定 ID/版本的数据,所以

select a.xxx, b.yyy 
from tableA a, tableB b
where a.ID = b.ID
    and a.Version = b.Version
    and .....

糟糕的桌子设计,但不在我手中。

在 Hibernate 中,我的在线研究建议创建一个单独的复合键类以供表共享,其中一个 A 对象包含一个 B 对象,并且在 A 的 hbm 文件中它们之间存在一对一的映射。

在我的项目中,我所有的 Hibernate 数据对象都是用 hbm 文件生成的,并且位于同一个地方。所以我想知道我是否也可以使用 hbm 文件创建这个复合键对象并将其与它的兄弟一起存储。问题是,它没有特别映射到任何 table (或者,您可以说它映射到 2 个表)。我正在尝试确定是否可以使用 hbm 文件创建此复合键类,以及是否建议这样做。我是不是走错了路?

提前致谢。

【问题讨论】:

  • 你能发布一个表定义的例子吗?您的意思是这两个表共享相同的键定义(即两个表都有一个复合主键idversion;但它们是恰好具有相同类型键的单独实体),或者两个表都引用了定义这个“关键”实体的第三个表?
  • 由于专有原因,我无法发布我的代码,并且编写示例将花费太长时间。但是,是的,您的第一种可能性是正确的 - 两个表恰好都有 id/version 的复合主键,我想要两个表中的一些数据,所以我需要将表 A(id/version)的复合 PK 加入到复合 PK表 B(ID/版本)。因此,我使用了相同的复合键类作为两个实体的 id。这不是我上面的问题,但我现在很难让 DAO 工作,很多“无法解决属性”错误......可能是另一篇文章的主题。

标签: java hibernate hbm


【解决方案1】:

我认为您误解了这个关键对象。您应该编写一个表示此键的 java 类,在这种情况下由一个 id 和一个版本组成。然后你使用这个类作为复合主键类型。您在数据库中看不到有关此类的任何信息。它仅供您和休眠使用,以识别实例。

一对一关系用于同步主键。一个对象应该引用另一个对象,并从中获得自己的主键。

文档:

大多数从 SQL 切换到 Hibernate 的人都很沮丧,因为他们尝试像使用 SQL 一样使用 hibernate。然后他们不会从中受益,但会获得额外的开销。

所以我的简短建议是: 你不应该再在表格中思考。除非您正在编写映射文件,否则忘记表格。只考虑类、对象和面向对象的结构。不要对您想要“在数据库中执行”的所有内容执行查询。在大多数事务中,您在开始时执行单个查询,然后使用延迟加载(您的代码无法识别)沿着属性导航。实现实际逻辑的代码不再了解数据库。然后使用 hibernate 开始变得有趣了。

【讨论】:

  • 谢谢你的建议,我很感激......不过,当你完全控制一个完美设计的环境时,Hibernate 似乎很棒,而很多人都没有。我也看过你链接到的教程,我没有看到它解决这个问题。我不认为我误解了关键对象,但也许我的问题不够清楚。我正在为直接绑定到数据库表的所有类编写映射文件。我的问题/问题是,由于这个关键类不绑定到任何表,可以/应该使用 hbm 文件生成它,动机是为了最好的项目组织和一致性。
猜你喜欢
  • 2012-08-31
  • 2017-09-23
  • 2011-11-28
  • 2017-01-09
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多