2013-03-13 48 views
4

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

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在获取所选主键时自动递增字段?

+1

我当然希望它会是MySQL,就像Hibe rnate永远不会知道是否有任何密钥被从另一个客户端删除或重用。 – 2013-03-13 16:23:49

+1

如果表格显示'auto_increment',那么它就是生成该数字的MySQL。 ORM无法计算真正唯一的整数主键。 – 2013-03-13 16:26:37

+0

这取决于你真正独特的东西吗?)。 ORM可以计算伪唯一整数主键。它只是低效。 – 2013-03-13 16:45:06

回答

6

要使用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; 
+0

所以你的意思是IDENTITY和AUTO对于MySQL数据库有相同的行为? – sp00m 2013-03-14 10:34:29

+0

对,因此最终Hibernate将使用MySql的底层标识机制 – 2013-03-14 15:05:53

0

这绝对是数据库。每个数据库方言有一个稍微不同的方式让休眠然后查询那个新分配的ID是什么,所以它可以将其设置在您的实体上

3

如果您指定GenerationType.IDENTITY,那么数据库将负责分配初始标识符。所以,使用

@GeneratedValue(strategy=GenerationType.IDENTITY) 

将离开DB负责。