Hibernate 不填充 AUTO_INCREMENT 列作为复合 PK、错误或反功能的一部分?

Posted

技术标签:

【中文标题】Hibernate 不填充 AUTO_INCREMENT 列作为复合 PK、错误或反功能的一部分?【英文标题】:Hibernate does not fill AUTO_INCREMENT column being part of composite PK, bug or anti-feature? 【发布时间】:2011-06-27 13:52:27 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

我将其称为“Hibernate 开发人员的设计选择”,而不是“期望的行为”,因为它显然不是许多用户想要的......【参考方案2】:

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

2.2.3.2.4。部分标识符生成

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

警告: Hibernate 团队一直觉得 这样的结构从根本上说 错误的。努力修复你的数据模型 在使用此功能之前。

(文档中有一个例子!)

但是partenon 也是正确的:同一版本的Hibernate Reference Guid(第 8.4 节。作为复合标识符的组件)表示这是不可能的(对于 xml)。

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

不知道Annotation和XML映射有没有区别。

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

【讨论】:

以上是关于Hibernate 不填充 AUTO_INCREMENT 列作为复合 PK、错误或反功能的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

在Java中使用hibernate从数据库中填充组合框

如何使用 Hibernate 将枚举值保存到 DB?

如何使用 Hibernate 和 JPA 处理填充下拉列表?

消息 -“无法读取 hi 值 - 您需要填充表:hibernate_sequence”

如何在表 Spring + Hibernate + Spring Security 中填充外键

Hibernate JPA - 没有填充ManyToOne关系