【问题标题】:If the database table column is set with auto_increment then why are we using @generatedValue如果数据库表列设置了 auto_increment 那么我们为什么要使用 @generatedValue
【发布时间】:2019-10-03 00:02:31
【问题描述】:

我真的很难理解为什么在表已经提供 auto_increment 时使用 @generatedValue 进行自动递增。有人可以向我解释一下吗?

【问题讨论】:

标签: java mysql hibernate hibernate-mapping


【解决方案1】:

@GeneratedValue 用于通知 JPA 提供者特定字段应该接收生成的值。然后基于传递给@GeneratedValue 注释的GenerationType,提供者将决定如何为主键分配值,例如通过将其委托给某些数据库机制。

例如,oracle 数据库需要序列来获取主键的生成值,因此在使用 oracle 数据库的情况下,您需要将GenerationType.SEQUENCE 传递给@GeneratedValue,并且您还必须创建这样的序列。

如果是 MySQL 数据库,您将传递 GenerationType.IDENTITY 并在其下方使用 MySQL 表中主键列的 AUTO_INCREMENT

GenerationType.IDENTITY 的文档说:

身份 指示持久性提供程序必须使用数据库标识列为实体分配主键。

我们需要所有这些注释,因为 JPA 只是用于处理关系数据库的抽象,它可以处理使用不同机制的不同数据库。 Hibernate 只是 JPA 的一种实现。

【讨论】:

  • 所以我的理解是假设我们在私有 int id 上使用 @generatedvalue(strategy=generationType.IDENTITY);然后它将使用 auto_incremented 列 ID 从 MySQL 表中获取 ID 的值。如果我错了,请纠正我。
  • 是的,你是对的。由于@Id 注释用于表示主键的字段,@GeneratedValue 用于同一字段以指示 JPA 提供程序应如何生成主键(在 MySQL 和使用GenerationType.IDENTITY 的情况下,它们将由 AUTO_INCREMENT 生成对应表中列的属性)。
  • 太棒了!非常感谢 michalk。
猜你喜欢
  • 2012-04-19
  • 2021-07-20
  • 1970-01-01
  • 2023-03-30
  • 2023-01-14
  • 2022-12-11
  • 1970-01-01
  • 2012-11-19
  • 2012-05-15
相关资源
最近更新 更多