具有TABLE策略的@GeneratedValue的含义

Rae*_*ald 2 jpa primary-key

JPA规范给出了注释的以下说明@GeneratedValue(strategy=TABLE):

TABLE发电机类型值指示持久性提供者必须使用底层数据库表以确保唯一分配针对该实体的主键.

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

Tom*_*icz 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

例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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

基本上ID_GEN是键值对的内部(非商业)表.每次JPA想要生成ID时,它都会查询该数据库:

SELECT GEN_VALUE
FROM ID_GEN
WHERE GEN_KEY = ...
Run Code Online (Sandbox Code Playgroud)

并递增GEN_VALUE列.此机制可用于模拟序列或进一步控制生成的ID.