【问题标题】:Does JPA @Id provide value if the table is auto-incrementing?如果表是自动递增的,JPA @Id 是否提供值?
【发布时间】:2017-09-02 20:11:40
【问题描述】:

这是我在 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),并且如果 我的数据库表配置了一个自动递增的主键字段,然后是什么值(在 应用层@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 是否仍以某种方式为我的应用提供价值(如果是,如何)?

【问题讨论】:

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

标签: hibernate jpa primary-key auto-increment


【解决方案1】:

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

简短的回答是。注解@Id 只是指定实体的主键。如果您希望其值自动生成,则必须使用 @GeneratedValue 注释该字段,指示适当的 GenerationType 策略,即:IDENTITY

@Entity
class Car {

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

    /...
}

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

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2010-10-04
    • 1970-01-01
    • 2016-03-07
    • 2011-11-04
    • 2019-08-26
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多