Welcome 微信登录

首页 / 软件开发 / JAVA / JPA中的主键生成策略

JPA中的主键生成策略2013-09-22 王 汉敏 Table 策略 (Table strategy)

这种策略中,持久化引擎 (persistence engine) 使用关系型数据库中的一个表 (Table) 来生成主键。这种策略可移植性比较好,因为所有的关系型数据库都支持这种策略。不同的 J2EE 应用服务器使用 不同的持久化引擎。

下面用一个例子来说明这种表生成策略的使用:

清单 1.Table 生成策略

@Entity public class PrimaryKey_Table {@TableGenerator(name = "PK_SEQ",table = "SEQUENCE_TABLE", pkColumnName= "SEQUENCE_NAME", valueColumnName= "SEQUENCE_COUNT")@Id@GeneratedValue(strategy =GenerationType.TABLE,generator="PK_SEQ") private Long id;//Getters and Setters //为了方便,类里面除了一个必需的主键列,没有任何其他列,以后类似 }
首先,清单 1 中使用 @javax.persistence.TableGenerator 这个注解来指定一个用来生成主键的表 (Table) ,这个注解可以使用在实体类上,也可以像这个例子一样使用在主键字段上。

其中,在这个例子中,name 属性 “PK_SEQ” 标示了这个生成器,也就是说这个生成器的名字是 PK_SEQ。这个 Table 属性标示了用哪个表来存贮生成的主 键,在这个例子中,用“ SEQUENCE_TABLE” 来存储主键,数据库中有对应的 SEQUENCE_TABLE 表。其中 pkColumnName 属 性用来指定的是生成器那个表中的主键,也就是 SEQUENCE_TABLE 这个表的主键的名字。属性 valueColumnName 指定列是 用来存储最后生成的那个主键的值。

也可以使用持久化引擎提供的缺省得 Table,例如:

清单 2. 使用确省 的表生成器

public class PK implements Serializable {private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.TABLE)private Long id; // Getters and Setters }
不同的持久化引擎有不同的缺省值,在 glass fish 中,Table 属性的缺省值是 SEQUENCE, pkColumnName 属性 缺省值是 SEQ_NAME,,valueColumnName 属性的缺省值是 SEQ_COUNT

Sequence 策略

一些数据库,比如 Oralce,有一种内置的叫做“序列” (sequence)的机制来生成主键。为了调用这个序列,需要使用 @javax.persistence.SequenceGenerator 这个注解。

例如

清单 3.sequence 策略生成主键

public class PK_Sequence implements Serializable {private static final long serialVersionUID = 1L;@SequenceGenerator(name="PK_SEQ_TBL",sequenceName="PK_SEQ_NAME")@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="PK_SEQ_TBL")private Long id; // Getters and Setters }
其中的 @javax.persistence.SequenceGenerator 定义如下:

清单 4.@SequenceGenerator 注解的定义

@Target(value = {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @Retention(value = RetentionPolicy.RUNTIME) public @interface SequenceGenerator {public String name();public String sequenceName() default "";public String catalog() default "";public String schema() default "";public int initialValue() default 1;public int allocationSize() default 50; }
从定义中可以看出这个注解可以用在类上,也可以用在方法和字段上,其中 name 属性指定的是所使用的生成器 ;sequenceName 指定的是数据库中的序列;initialValue 指定的是序列的初始值,和 @TableGenerator 不同是它的缺省 值 1;allocationSize 指定的是持久化引擎 (persistence engine) 从序列 (sequence) 中读取值时的缓存大小,它的缺 省值是 50。