世代类型IDENTITY如何工作?它如何知道下一个要插入的主键是什么

Nic*_*Div 4 java database jpa

在将实体持久存储到数据库中以及在多线程应用程序(java)中,生成类型IDENTITY如何知道下一个要插入数据库中的下一个整数是什么,两个线程是否不可能为实体获得相同的主键?

Wan*_*ker 7

对于@Id属性,根据本文档

有几种生成唯一ID的策略。一些策略与数据库无关,而另一些策略则使用内置数据库支持。JPA支持通过GenerationType枚举值定义的几种ID生成策略:TABLE,SEQUENCE和IDENTITY。

当使用IDENTITY策略时,数据库可以自动分配下一个值。

 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 private long id;
Run Code Online (Sandbox Code Playgroud)

通常,在这种情况下,column的类型为auto increment

请注意,这些ID不是用Java代码生成的,而是由基础数据库分配的-数据库是为与多个连接一起使用而建立的,其中用户可以在每个连接中插入一条记录。

在Java方面,每个线程将使用一个连接工作-通常,此类代码可用于连接池,并从连接池借用连接-因此本质上是线程安全的。

根据本文档

身份排序使用数据库中的特殊IDENTITY列来允许数据库在插入对象的行时自动为其分配ID。许多数据库(例如MySQL,DB2,SQL Server,Sybase和PostgreSQL)都支持标识列。Oracle不支持IDENTITY列,但可以使用序列对象和触发器来模拟它们。