2

JPA 规范对注解给出了以下解释@GeneratedValue(strategy=TABLE)

生成器TABLE类型值指示持久性提供程序必须使用底层数据库表为实体分配主键以确保唯一性。

但是“使用底层数据库表”在实践中意味着什么?这是否意味着使用辅助表?还是通过扫描实体表来查找未使用的 ID?或者是其他东西?

4

2 回答 2

8

查看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。

于 2012-08-25T12:22:14.713 回答
0

对于 EclipseLink,它使用一个辅助表。文件

默认情况下,EclipseLinkTABLE使用名为SEQUENCE, withSEQ_NAMESEQ_COUNTcolumns的表选择策略

于 2012-08-25T12:20:31.360 回答