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

Does JPA @Id provide value if the table is auto-incrementing?

这是我在 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 我已经有一个预先存在的数据库,if 我计划使用 Hibernate 仅 验证 该数据库而不是为我创建一个数据库(通过 hibernate.hbm2ddl.auto = validate),并且 if 我的数据库 table配置了一个自增的主键字段,那么@Id给我提供什么值(在应用层)?含义,给定:

...那么我的实体 class 是否包含 @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 是否仍以某种方式为我的应用程序提供价值(如果是,如何)?

Does JPA @Id provide value if the table is auto-incrementing?

简短的回答是。注释 @Id just specifies the primary key of an entity. If you want its value to be auto-generated then you have to annotate the field with @GeneratedValue indicating the appropriate GenerationType strategy, i.e.: IDENTITY:

@Entity
class Car {

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

    /...
}

请注意,并非所有 RDBMS 都支持自动递增或序列类型,即:Oracle 没有自动递增类型,但您可以创建和使用 sequence相反。