具有TABLE策略的@GeneratedValue的含义

时间:2012-08-25 12:11:03

标签: jpa primary-key

JPA规范给出了注释@GeneratedValue(strategy=TABLE)

的以下说明
  

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

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

2 个答案:

答案 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_NAMESEQ_COUNT