JPA规范给出了注释@GeneratedValue(strategy=TABLE)
:
TABLE
生成器类型值表示持久性提供程序必须使用基础数据库表为实体分配主键,以确保唯一性。
但是“使用底层数据库表”在实践中意味着什么呢?这是否意味着使用辅助表?或者通过扫描实体表来查找未使用的ID?或其他什么?
答案 0 :(得分:8)
查看JavaDoc for TableGenerator
,它有一个很好的例子:
示例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。
答案 1 :(得分:0)
对于EclipseLink,它使用辅助表。 The documentation说
默认情况下,EclipseLink使用名为
TABLE
的表选择SEQUENCE
策略,其中包含SEQ_NAME
和SEQ_COUNT
列