如果表是自动递增的,JPA @Id是否提供值?

时间:2017-04-07 12:28:16

标签: hibernate jpa primary-key auto-increment

这是我在Hibernate文档中高低搜索的内容,并且令人惊讶地无法找到答案。

几乎所有Hibernate / JPA的规范示例都演示了通过@Id注释配置主键,如下所示:

// Groovy pseudo-code!
@Entity
class Car {
  @Id
  @Column(name = "car_id")
  Long id

  @Column(name = "car_make")
  String make

  @Column(name = "car_model")
  String model
}

但是如果我已经有一个预先存在的数据库, if 我打算使用Hibernate来仅仅验证< / em>该数据库而不是为我创建一个(通过hibernate.hbm2ddl.auto = validate),而如果我的数据库表配置了一个自动递增的主键字段,然后是什么值(在应用层@Id为我提供了什么?意思是,给定:

  • hibernate.hbm2ddl.auto = validate;和
  • 表/实体具有自动递增PK(例如使用MySQL AUTO_INCREMENTING

...那么我的应用程序对我的实体类是否包含@Id有什么影响呢?为什么我不能这样写:

// Groovy pseudo-code!
@Entity
class Car {
  @Column(name = "car_id")
  Long id

  @Column(name = "car_make")
  String make

  @Column(name = "car_model")
  String model
}

或者@Id是否仍以某种方式为我的应用提供价值(如果是,如何)?

1 个答案:

答案 0 :(得分:1)

  

如果表自动递增,JPA @Id是否提供值?

简短回答。注释@Id仅指定实体的主键。如果您希望自动生成其值,则必须使用@GeneratedValue对该字段进行注释,以指示相应的GenerationType策略,即:IDENTITY

@Entity
class Car {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "car_id")
    Long id

    /...
}

请注意,所有RDBMS都不支持自动增量或串行类型,即:Oracle没有自动增量作为类型,但您可以创建并使用序列