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 策略生成主键
@Entity 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; }