Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa @GeneratedValue与表策略的含义_Jpa_Primary Key - Fatal编程技术网

Jpa @GeneratedValue与表策略的含义

Jpa @GeneratedValue与表策略的含义,jpa,primary-key,Jpa,Primary Key,JPA规范对注释@GeneratedValue(strategy=TABLE)给出了以下解释: 表生成器类型值指示持久性提供程序必须使用基础数据库表为实体分配主键,以确保唯一性 但“使用底层数据库表”在实践中意味着什么?这是否意味着使用辅助表?或者通过扫描实体表来查找未使用的ID?或者别的什么?在日食的情况下,它使用一个辅助表。说 默认情况下,EclipseLink使用名为SEQUENCE的表选择表策略,表中有序列名称和序列计数列 看看,它有一个很好的例子说明了它是如何工作的: 例1: @Ent

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

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


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

在日食的情况下,它使用一个辅助表。说

默认情况下,EclipseLink使用名为
SEQUENCE
的表选择
策略,表中有
序列名称
序列计数

看看,它有一个很好的例子说明了它是如何工作的:

例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\u GEN
是键值对的内部(非业务)表。每次JPA想要生成ID时,它都会查询该数据库:

SELECT GEN_VALUE
FROM ID_GEN
WHERE GEN_KEY = ...
并增加
GEN_值
列。此机制可用于模拟序列或进一步控制生成的ID。

的回答是“只有每100次插入才会锁定序列表中的行”,建议使用辅助表。