谁负责 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 【问题描述】:

mysql

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 之间主键的自动递增?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate各种主键生成策略与配置详解

Hibernate各种主键生成策略与配置详解

Hibernate各种主键生成策略与配置详解

Hibernate各种主键生成策略与配置详解

Hibernate各种主键生成策略与配置详解(转)

Hibernate各种主键生成策略与配置详解