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 - 使用 shell 脚本将参数传递给 Java

mysql - 为什么我的 rails 插入速度很慢,即使我使用线程?

php - 使用 NOT IN 将 SQL 转换为 Doctrine 2 Query Builder 或 DQL?

java - 如何根据 SEAM 中另一个字段的值来根据需要验证一个字段?

XMLBeanDefinitionStoreException : Cannot find the declaration of element 'beans'

java - 资源本地到 JTA

java - execSQL 仅显示 XML 的最后一行

java - Spring Reactive Web - 异常总是包含在 500 中

mysql - 使用当前日期加上当前日期后 30 天创建表

在 Java Swing 应用程序中关闭 Hibernate Session 时出现 java.lang.NoSuchMethodError