【问题标题】:Meaning of @GeneratedValue with strategy of TABLE@GeneratedValue 与 TABLE 策略的含义
【发布时间】:2023-03-26 00:33:01
【问题描述】:

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

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

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

【问题讨论】:

标签: jpa primary-key


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对于 EclipseLink,它使用辅助表。 The documentation

    默认情况下,EclipseLink 使用名为SEQUENCE 的表选择TABLE 策略,其中包含SEQ_NAMESEQ_COUNT

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2012-12-10
      • 2022-07-12
      • 2023-03-29
      • 2023-04-10
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      相关资源
      最近更新 更多