从hbm文件生成Hibernate组合密钥对象

时间:2010-07-15 13:05:54

标签: java hibernate hbm

(Parenthetical rant :)我是一个Hibernate初学者,因为我在15秒内可以在SQL中编写一个简单连接的开销而感到有点沮丧。 (结束咆哮)

因此情况如下:我有两个表都包含相同的复合主键 - 让我们调用表'ID'和'Version'中的列。我需要来自两个表的特定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文件创建此复合键类,以及是否建议这样做。我是以错误的方式解决这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为你误解了这个关键对象。您应该编写一个代表此密钥的java类,在这种情况下由id和版本组成。然后,您将此类用作复合主键类型。您无法在数据库中看到有关此类的任何信息。它只是由您和hibernate使用来识别实例。

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

文档:

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

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