Java 如果数据库表列设置为自动增量,那么为什么要使用@generatedValue

Java 如果数据库表列设置为自动增量,那么为什么要使用@generatedValue,java,mysql,hibernate,hibernate-mapping,Java,Mysql,Hibernate,Hibernate Mapping,我真的很难理解为什么在表已经提供自动增量的情况下,is@generatedValue用于自动增量。请向我解释一下。@GeneratedValue用于通知JPA提供商特定字段应接收生成的值。然后根据传递给@GeneratedValue注释的GenerationType,提供者将决定如何将值分配给主键,例如通过将其委托给某个数据库机制 例如,oracle数据库需要序列来获取主键的生成值,因此在使用oracle数据库的情况下,您需要将GenerationType.SEQUENCE传递给@Generat

我真的很难理解为什么在表已经提供自动增量的情况下,is@generatedValue用于自动增量。请向我解释一下。

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

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

对于MySQL数据库,您将传递
GenerationType.IDENTITY
,并在它下面使用MySQL表中主键列的
AUTO_INCREMENT

正如
GenerationType.IDENTITY
的文档所述:

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


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

它告诉ORM框架在保存记录之前从序列生成器中获取下一个值。@Headlush您能用外行的话给我解释一下吗。请参考这个,我理解的是假设我们使用@generatedvalue(strategy=generationType.IDENTITY)关于私有int-id;然后它将从MySQL表中获取ID值,并自动递增列ID。如果我错了,请纠正我。是的,你是对的。由于
@Id
注释用于表示主键的文件,因此在同一字段上使用
@GeneratedValue
来指示JPA提供者如何生成主键(对于MySQL并使用
GenerationType.IDENTITY
,它们将通过相应表中列的自动增量属性生成).太棒了!非常感谢你,迈克。