JPA 规范对注解给出了以下解释@GeneratedValue(strategy=TABLE)
:
生成器
TABLE
类型值指示持久性提供程序必须使用底层数据库表为实体分配主键以确保唯一性。
但是“使用底层数据库表”在实践中意味着什么?这是否意味着使用辅助表?还是通过扫描实体表来查找未使用的 ID?或者是其他东西?
JPA 规范对注解给出了以下解释@GeneratedValue(strategy=TABLE)
:
生成器
TABLE
类型值指示持久性提供程序必须使用底层数据库表为实体分配主键以确保唯一性。
但是“使用底层数据库表”在实践中意味着什么?这是否意味着使用辅助表?还是通过扫描实体表来查找未使用的 ID?或者是其他东西?
查看JavaDocTableGenerator
,它有一个很好的例子来说明它是如何工作的:
示例 1:
@Entity public class Employee {
...
@TableGenerator(
name="empGen",
table="ID_GEN",
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="EMP_ID",
allocationSize=1)
@Id
@GeneratedValue(strategy=TABLE, generator="empGen")
int id;
...
}
示例 2:
@Entity public class Address {
...
@TableGenerator(
name="addressGen",
table="ID_GEN",
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="ADDR_ID")
@Id
@GeneratedValue(strategy=TABLE, generator="addressGen")
int id;
...
}
基本上ID_GEN
是键值对的内部(非业务)表。每次 JPA 想要生成 ID 时,它都会查询该数据库:
SELECT GEN_VALUE
FROM ID_GEN
WHERE GEN_KEY = ...
并增加GEN_VALUE
列。这种机制可用于模拟序列或进一步控制生成的 id。
对于 EclipseLink,它使用一个辅助表。文件说
默认情况下,EclipseLink
TABLE
使用名为SEQUENCE
, withSEQ_NAME
和SEQ_COUNT
columns的表选择策略