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、错误或反功能的一部分?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Hibernate 和 JPA 处理填充下拉列表?
消息 -“无法读取 hi 值 - 您需要填充表:hibernate_sequence”