首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于 persistence 中主键的生成对策

2012-09-09 
关于 persistence 中主键的生成策略注解 @javax.persistence.Id 标示了构成表中主键的一个或多个成员属性。

关于 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 时的递增值。



TABLE 和 SEQUENCE 生成器可以定义在类中的任何一处。

?

?

热点排行