【问题标题】:Who is responsible of the auto-incrementation of a primary key between MySQL and Hibernate?谁负责 MySQL 和 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 可以计算一个伪唯一整数主键。它只是效率低下。

标签: java mysql hibernate auto-increment


【解决方案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 是什么,以便它可以在你的实体上设置它

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 2015-11-13
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多