关于 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 生成器可以定义在类中的任何一处。

 

 

你可能感兴趣的:(生成)