注解 @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 时的递增值。