4

我发现 Hibernate 和复合键存在问题,其中一个列自动递增。

我正在使用 MySQL 和由 2 列 GID 和 LANG 组成的主键。GID 列设置为 AUTO_INCREMENT。插入工作,休眠插入新行,当 GID 为空时 MySQL 添加 auto_generated id。但是,Hibernate 不会将给定对象中的 GID 字段设置为持久。

我听说过通常与使用hibernate的复合主键有关的问题,所以我问这是hibernate中的一个错误,还是开发人员预谋留下的反功能(因为没有实现,所以不会实现)?

4

2 回答 2

5

Hibernate Annotations Reference Guide for 3.5.6-Final(第2.2.3.2.4 节。部分标识符生成)说可以将序列用于复合 id 的一部分。

2.2.3.2.4。部分标识符生成

Hibernate 支持自动生成一些标识符属性。只需在一个或多个 id 属性上使用 @GeneratedValue 注释。

警告:Hibernate 团队一直认为这样的结构是根本错误的。在使用此功能之前,请努力修复您的数据模型。

(文档中有一个例子!)

但是partenon也是正确的:同一版本的Hibernate 参考指南(第 8.4 节。作为复合标识符的组件)说这是不可能的(对于 xml)。

您不能使用 IdentifierGenerator 生成复合键。相反,应用程序必须分配自己的标识符。

我不知道 Annotation 和 XML 映射之间是否有区别。

<irony>我开始越来越喜欢hibernate。</irony>

于 2011-02-15T13:13:28.110 回答
1

这不是一个错误。这是所需的行为,您可以在文档中看到:

您不能使用 IdentifierGenerator 生成复合键。相反,应用程序必须分配自己的标识符。

http://docs.jboss.org/hibernate/stable/core/reference/en/html/components.html#components-compositeid

于 2011-02-15T13:06:21.597 回答