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

Hibernate 如果表是自动递增的,JPA@Id是否提供值?,hibernate,jpa,primary-key,auto-increment,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") S

这是我在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
}
但是,如果我已经有一个预先存在的数据库,如果我计划使用Hibernate只验证该数据库而不是为我创建一个数据库(通过
Hibernate.hbm2ddl.auto=validate
),如果我的DB表配置了一个自动递增的主键字段,那么值是多少(在应用层
@Id
是否提供了我的意思

  • hibernate.hbm2ddl.auto=验证
    ;以及
  • 表/实体有一个自动递增的主键(例如MySQL
    自动递增的主键)
…那么,我的实体类中是否包含
@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
是否仍以某种方式为我的应用程序提供价值(如果是,如何提供)

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

简短的回答是。注释仅指定实体的主键。如果希望自动生成其值,则必须在字段上注释相应的策略,即:


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

每个对象都必须有一个标识。如果您没有
@Id
,则对象没有标识,因此无效。如果数据存储正在执行自动增量然后您应该将字段标记为
@GeneratedValue(strategy=IDENTITY)
,就像JPA规范告诉您的那样,这样JPA提供者就知道它在数据存储中的属性了。谢谢@NeilStockton(+1)如果您不介意的话,可以问以下几个问题:(1)我发现的所有Hibernate/JPA文档中都有措辞,表明
@GeneratedValue(strategy=GenerationType.IDENTITY)
用于配置JPA提供程序(Hibernate)和声明JPA(而不是DB)的方式应该正在生成值。我不希望Hibernate生成我的PK值,我希望DB生成。你确定
GenerationType.IDENTITY
不会与MySQL自动生成的内容冲突吗?还有(2)当你说“如果你没有
@Id
,那么一个对象就没有标识,因此无效”是什么意思“无效”?Hibernate是否会引发异常?它是否会在我的代码的其他地方引起问题(这是问题的根源)。再次感谢!IDENTITY表示列使用AUTO_INCREMENT/SERIAL/IDENTITY,因此它的值在数据存储中设置(因此不会出现在INSERT语句中)。这就是JPA规范所说的。至于2,所有实体都必须定义一个身份,同样来自JPA specThanks,在没有
@Id
的情况下立即运行我的应用程序,并且一切似乎都正常运行。我想我暂时不使用它,因为它似乎只是为了满足规范要求,但在运行时没有任何功能Hibernate正在验证,数据库正在自动递增。
@Entity
class Car {

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

    /...
}