关于 persistence 中主键的生成策略
注解 @javax.persistence.Id 标示了构成表中主键的一个或多个成员属性。
?
我们可以为 entity bean 手工生成主键,也可以让 persistence provider 代劳。
?
如果需要让 persistence provider 代劳,必须使用注解 @javax.persistence.GeneratedValue
?
以下是几种主键生成策略的介绍:
?
?
AUTO 策略
?
指明由 persistence provider 自动生成主键,也是 GeneratedValue 默认的生成策略。
?
Java代码:
@Id
@GeneratedValue
private int id;
?
XML代码:
<id name="id">
<generated-value strategy="AUTO" />
</id>
?
?
IDENTITY 策略
?
自动增加标识,如 mysql、mssql 等,许多数据库都有对此属性实现
?
?
Java代码:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
?
XML代码:
<id name="id">
<generated-value strategy="IDENTITY" />
</id>
?
?
?
TABLE 策略
?
定义一张关系表,并利用该表生成数值型的主键
?
create table GENERATOR_TABLE
(
??PRIMARY_KEY_COLUMN VARCHAR not null
, VALUE_COLUMN long not null
)
?
字段 PRIMARY_KEY_COLUMN 匹配要生成的主键,字段 ?VALUE_COLUMN 持有计数器的值。
?
?
Java代码:
@TableGenerator(name="CUST_GENERATOR"
? ?, ?table="GENERATOR_TABLE"
? ?, ?pkColumnName="PRIMARY_KEY_COLUMN"
? ?, ?valueColumnName="VALUE_COLUMN"
? ?, ?pkColumnValue="CUST_ID"
? ?, ?allocationSize=10)
?
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="CUST_GENERATOR")
private int id;
?
XML代码:
<table-generator name="CUST_GENERATOR"
? ? table="GENERATOR_TABLE"
? ? pk-column-name="PRIMARY_KEY_COLUMN"
? ? value-column-name="VALUE_COLUMN"
? ? pk-column-value="CUST_ID"
? ? allocation-size="10" />
?
<attributes>
<id name="id">
<generated-value strategy="TABLE" generator="CUST_GENERATOR" />
</id>
?
</attributes>
?
?
TableGenerator 属性解释
?
name:定义了 @TableGenerator 的名称,该名称在 @Id.generator() 属性中被引用。
table: 定义了维护主键关系表的表名。
pkColumnName:待生成实体主键的字段名称。
valueColumnName:待生成实体主键计数器的字段名。
?
pkColumnValue:匹配需要生成的主键,此名是?PRIMARY_KEY_COLUMN 字段中的值。
allocationSize:当 persistence provider 在表中查询新值时,计数器一次递增多少。这允许 persistence ? ?provider 缓存一批 ID,而不必在每次需要新的 ID 时都去访问数据库。
?
?
?
SEQUENCE 策略
?
序列生成器,如 Oracle
?
?
Java代码:
@SequenceGenerator(name="CUST_SEQUENCE",
? , sequenceName="CUST_SEQ")
?
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CUST_SEQUENCE")
private int id;
?
XML代码:
?
<sequence-generator name="CUST_SEQUENCE"
? ? sequence-name="CUST_SEQ"
? ? initial-value="0"
? ? allocation-size="50"?/>
?
<attributes>
<id name="id">
<generated-value strategy="SEQUENCE" generator="CUST_SEQUENCE" />
</id>
?
</attributes>
?
?
SequenceGenerator 属性解释
?
name:定义了 @SequenceGenerator 的名称,该名称在 @Id.generator() 属性中被引用。
sequenceName:指定使用数据库中哪一个 SEQUENCE。
initialValue:主键的初始值。
allocationSize:访问 sequence 时的递增值。
?
?