0

(括号里的咆哮:)我是一个 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 文件创建这个复合键对象并将其与它的兄弟一起存储。问题是,它没有特别映射到任何(或者,您可以说它映射到 2 个表)。我正在尝试确定是否可以使用 hbm 文件创建此复合键类,以及是否建议这样做。我会以错误的方式解决这个问题吗?

提前致谢。

4

1 回答 1

1

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

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

文档:

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

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

于 2010-07-15T13:13:22.833 回答