MySQL和Hibernate之间的主键自增由谁负责?

5

MySQL

CREATE TABLE `role` (
  `id_role` INT(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id_role`)
) AUTO_INCREMENT=1;

Hibernate

@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自动增量字段,同时返回所选的主键?


1
我希望它是MySQL,因为Hibernate无法知道是否有任何键被另一个客户端删除或重用。 - Bart Friederichs
1
如果表中有 auto_increment,那么是 MySQL 生成数字。ORM 无法计算真正唯一的整数主键。 - N.B.
这取决于你所说的“真正独特”的含义 ;) 。ORM可以计算出伪唯一的整数主键。但这只是低效的做法。 - Adam Gent
3个回答

6
为了使用MySQL的AUTO_INCREMENT列,您应该使用IDENTITY策略:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

当在MySQL中使用AUTO时,您将获得以下结果:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

实际上等同于:

@Id @GeneratedValue
private Long id;

那么您的意思是,对于MySQL数据库,IDENTITY和AUTO具有相同的行为? - sp00m
好的,最终Hibernate将使用MySql的底层身份验证机制。 - Sujay Mumbaraddi

3
如果您指定GenerationType.IDENTITY,那么数据库将负责分配初始标识符。因此,使用时,请
@GeneratedValue(strategy=GenerationType.IDENTITY)

将会把数据库交由负责人处理。


0

肯定是数据库的问题。每个数据库方言都有略微不同的方式,Hibernate可以查询新分配的ID是什么,以便将其设置在您的实体上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接