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