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

Java 从hbm文件生成Hibernate复合密钥对象,java,hibernate,hbm,Java,Hibernate,Hbm,(旁白:我是一个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初学者,对于我可以在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文件创建这个复合密钥类,以及这样做是否可取。我走错方向了吗


提前谢谢。

我想你误解了这个关键对象。您应该编写一个java类,它表示这个键,在本例中由一个id和一个版本组成。然后将该类用作复合主键类型。在数据库中看不到此类的任何内容。您和hibernate只使用它来标识实例

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

文件:

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

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

您能发布一个表定义的示例吗?您的意思是这两个表共享相同的键定义(即,两个表都有一个复合主键,分别为
id
version
;但它们是单独的实体,恰好具有相同类型的键),还是这两个表都引用了定义此“键”的第三个表实体?由于专有原因,我无法发布我的代码,编写一个示例将花费太长时间。但是,是的,您的第一种可能性是正确的-两个表碰巧都有id/version的复合主键,我想从两个表中获得一些数据,所以我需要将表A(id/version)的复合主键连接到表B(id/version)的复合主键。因此,我使用了与这两个实体的id相同的复合键类。这不是我上面的问题,但我现在很难让DAO工作,很多“无法解决属性”错误…可能是另一篇文章的主题。谢谢你的建议,我很感激…不过,当你完全控制一个设计完美的环境时,Hibernate似乎很棒,而很多人都不是。我也看过你链接到的教程,我没有看到它解决这个问题。我不认为我误解了关键对象,但也许我的问题不够清楚。我正在为直接绑定到DB表的所有类编写映射文件。我的问题是,既然这个关键类没有绑定到任何表,那么它是否可以/应该使用hbm文件生成,动机是为了实现最佳的项目组织和一致性。