谁负责 MySQL 和 Hibernate 之间主键的自动递增?
Posted
技术标签:
【中文标题】谁负责 MySQL 和 Hibernate 之间主键的自动递增?【英文标题】:Who is responsible of the auto-incrementation of a primary key between MySQL and Hibernate? 【发布时间】:2013-03-01 17:09:33 【问题描述】:CREATE TABLE `role` (
`id_role` INT(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id_role`)
) AUTO_INCREMENT=1;
休眠
@Entity
public class Role
private Integer idRole;
@Column(name = "id_role", precision = 10)
@GeneratedValue
@Id
public Integer getIdRole()
return idRole;
public void setIdRole(Integer idRole)
this.idRole = idRole;
鉴于上述背景,谁负责在创建新的role
时自动增加id_role
列?换句话说,Hibernate 是在运行create
SQL 语句之前设置主键值,还是将其设置为null
并让 MySQL 在取回选择的主键时自动递增字段?
【问题讨论】:
我当然希望是 MySQL,因为 Hibernate 永远无法知道是否从另一个客户端删除或重用了任何密钥。 如果表格显示auto_increment
,那么生成数字的是 MySQL。 ORM 无法计算真正唯一的整数主键。
这取决于你所说的真正独特的意思;)。 ORM 可以计算一个伪唯一整数主键。它只是效率低下。
【参考方案1】:
要使用 MySQL AUTO_INCREMENT
列,您应该使用 IDENTITY
策略:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
将AUTO
与 MySQL 结合使用会得到什么:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
实际上相当于
@Id @GeneratedValue
private Long id;
【讨论】:
所以您的意思是 IDENTITY 和 AUTO 对于 MySQL 数据库具有相同的行为? 对,所以 Hibernate 最终会为 MySql 使用底层身份机制【参考方案2】:如果您指定 GenerationType.IDENTITY
,那么数据库将负责分配初始标识符。所以,使用
@GeneratedValue(strategy=GenerationType.IDENTITY)
让数据库负责。
【讨论】:
【参考方案3】:绝对是数据库。每个 db 方言都有一个稍微不同的方式让 Hibernate 然后查询新分配的 ID 是什么,以便它可以在你的实体上设置它
【讨论】:
以上是关于谁负责 MySQL 和 Hibernate 之间主键的自动递增?的主要内容,如果未能解决你的问题,请参考以下文章