java - 如果数据库表列设置为 auto_increment 那么我们为什么要使用 @ generatedValue

标签 java mysql hibernate hibernate-mapping

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

最佳答案

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

例如,Oracle 数据库需要序列来获取主键的生成值,因此在使用 Oracle 数据库的情况下,您可以将 GenerationType.SEQUENCE 传递给 @GenerateValue,然后您将也必须创建这样的序列。

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

正如 GenerationType.IDENTITY 的文档所述:

IDENTITY Indicates that the persistence provider must assign primary keys for the entity using a database identity column.

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

关于java - 如果数据库表列设置为 auto_increment 那么我们为什么要使用 @ generatedValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56156185/

相关文章:

java.lang.ClassCastException : org. hibernate.type.StringType 无法转换为 org.hibernate.type.VersionType

java - 缺少 Google App Engine 应用程序的 JSON 库?

java - 从ear项目中的外部jar获取文件

java - 警报管理器不启动android

java - 在 Java 中使用 TimeUnit 转换的性能损失

mysql - 带 COUNT 的 LEFT JOIN 返回意外值

mysql - 如何将一个表中的多个列连接到另一个表中的列

mysql - 对大型表(有两个左连接表)的查询结果非常慢

java - 使用 hibernate 按 userId 字段过滤全文搜索结果

java - 使用 Glassfish 4.1 hibernate