`

JPA 表生成器@ TableGenerator

 
阅读更多
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,不必担心不同数据库不兼容造成的问题。

使用以下SQL脚本创建一个表“tb_generator”,并插入两条数据,SQL脚本如下所示。

CREATE TABLE  tb_generator (

  id int(20) unsigned NOT NULL auto_increment,

  gen_name varchar(255) NOT NULL,

  gen_value int(20) NOT NULL,

  PRIMARY KEY  (id)

)



INSERT INTO tb_generator ( gen_name ,gen_value ) VALUES ( 'CUSTOMER_PK',1);

INSERT INTO tb_generator ( gen_name ,gen_value ) VALUES ( 'CONTACT_PK',100);

执行SQL语句后,表中的数据如图5.1所示。

图5.1  自动生成主键表tb_generator

现在有另外两个表customer和contact,它们每次新建记录时生成主键的值分别“CUSTOMER_PK”所对应的value值加1,“CONTACT_PK”所对应的value值加1。

下面就来具体看一下如何来配置主键的生成策略,以配置“customer”表为例,步骤如下。

(1)在Entity标记主键的位置,指定主键生成策略为“GenerationType.TABLE”,具体设置如下。

@Entity

@Table(name = "customer")

public final class CustomerEO implements java.io.Serializable {



         private Integer id;



         @Id

         @GeneratedValue(strategy = GenerationType.TABLE)

         public Integer getId() {

                   return this.id;

         }



         public void setId(Integer id) {

                   this.id = id;

         }

}

(2)指定生成主键策略的名称,例如这里命名为“customer_gen”。

         @Id

         @GeneratedValue(strategy = GenerationType.TABLE,generator="customer_gen")

         public Integer getId() {

                   return this.id;

         }

(3)使用@ TableGenerator标记定义表生成策略的具体设置,代码如下所示。

         @Id

         @GeneratedValue(strategy = GenerationType.TABLE,generator="customer_gen")

         @TableGenerator(name = "customer_gen",

                            table="tb_generator",

                            pkColumnName="gen_name",

                            valueColumnName="gen_value",

                            pkColumnValue="CUSTOMER_PK",

                            allocationSize=1

         )

         public Integer getId() {

                   return this.id;

         }

这样,当通过以下代码创建新的实体后,表tb_generator中“CUSTOMER_PK”的value的值将自动加1,如图5.2所示。

             CustomerEO customer = new CustomerEO();

             customer.setName("Janet");

             customer.setShortName("Jane");

             entityManager.persist(customer);

图5.2  添加新数据后表tb_generator

(4)@TableGenerator标记用于设置主键使用数据表生成主键的策略,它的定义如下所示。

@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)

public @interface TableGenerator {

String name();

String table() default "";

String catalog() default "";

String schema() default "";

String pkColumnName() default "";

String valueColumnName() default "";

String pkColumnValue() default "";

int initialValue() default 0;

int allocationSize() default 50;

UniqueConstraint[] uniqueConstraints() default {};

}

在使用此@ TableGenerator标记时,需要注意以下几个问题。

l         该标记可以在类名、方法名、和属性名前。并且一旦在实体中标记,它不仅可以在本实体中使用,在其他的实体中也可以引用。它的作用范围是整个persist unit配置的实体类中。

例如以上的定义也可以写成:

@Entity

@Table(name = "customer")

@TableGenerator(name = "customer_gen",

                   table="tb_generator",

                   pkColumnName="gen_name",

                   valueColumnName="gen_value",

                   pkColumnValue="CUSTOMER_PK",

                   allocationSize=1

)

public class CustomerEO implements java.io.Serializable {

         ……

}

或者将其标注在ContactEO中,也是可以的。但建议标注在所作用的实体中,这样有助于方便查看。

l         name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。

l         table属性表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。

l         catalog属性和schema具体指定表所在的目录名或是数据库名。

l         pkColumnName属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值

l         valueColumnName属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值

l         pkColumnValue属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为“CUSTOMER_PK”。

l         initialValue表示主键初识值,默认为0。

l         allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。

l         UniqueConstraint与@Table标记中的用法类似,请读者参阅5.2.1小节。

用一个简单示意图表示持久化主键表和表生成策略,如图所示。

分享到:
评论

相关推荐

    表生成器 @TableGenerator

    `@TableGenerator` 是一个JPA(Java Persistence API)注解,用于在实体类中定义自增序列的生成器,主要用于为数据库表中的主键生成唯一的ID。这篇博文链接指向的是一个关于`@TableGenerator` 使用的讨论,虽然具体...

    JPA学习笔记-EJB-03JPA主键生成策略总结

    该策略通过`@TableGenerator`注解来配置生成器的细节。 - **示例代码**: ```java @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "myTablePK") @TableGenerator( name = "myTablePK", ...

    JPA注解详解

    - `pkColumnName`: 生成器表中主键列的名称,默认由JPA提供。 - `pkColumnValue`: 主键列的初始值,默认由JPA提供,可按需调整。 例如,自定义主键生成器表名和初始值: ```java @TableGenerator(name="empGen", ...

    spring注解详解

    - **pkColumnName**:指定主键生成器表中主键列的名称,默认由JPA提供,但可按需自定义。 - **pkColumnValue**:指定主键生成器表中主键列的初始值,同样,如果默认值不满足需求,可以进行设置。 #### 四、示例代码...

    JPA注解教程

    在此示例中,`employee_gen` 为主键生成器的名称,`ID_GEN` 为表名,`GEN_NAME` 和 `GEN_VAL` 分别为主键生成器表中的主键列和值列的名称。`initialValue` 设置为主键序列的初始值100,`allocationSize` 设置为50,...

    JPA-2 基本注解

    9. **@TableGenerator**: 用于定义自定义的主键生成器,通常配合@GeneratedValue一起使用,适用于非自动递增的主键策略,例如序列。 这些注解的使用使得开发者能够在Java代码中声明式地完成ORM配置,极大地简化了...

    JPA注解参考文档.txt

    - **@TableGenerator**:用于指定表生成器。 ##### 5. **属性映射注解** - **@Basic**:用于标记基本类型字段。 - **@Enumerated**:用于处理枚举类型的字段。 - **@Temporal**:用于处理日期和时间类型的字段。 -...

    JPA 批注总结参考

    - `@SequenceGenerator` 和 `@TableGenerator`:定义主键生成器的配置。 4. **直接映射批注**: - `@Basic`:默认的映射方式,适用于大多数Java基本类型和枚举类型。 - `@Enumerated`:用于将枚举类型映射到...

    jpa 标注

    - **@SequenceGenerator** / **@TableGenerator**:用于定义序列或表生成器,以生成主键值。 4. **直接映射** - **@Basic**:指定一个基本属性,如字符串或整数等。 - **@Enumerated**:用于枚举类型的映射。 -...

    JPA 批注参考

    - **@TableGenerator**: 用于定义基于表的主键生成器。 **4. 直接映射 (Direct Mapping)** - **@Basic**: 用于指定基本类型的映射,如 String、Integer 等。 - **@Enumerated**: 用于指定枚举类型的映射。 - **@...

    jpa 批注参考 doc 格式 提供了一个对象关系映射方法

    - `@SequenceGenerator`、`@TableGenerator`:指定主键生成器的细节。 4. **直接映射**: - `@Basic`:默认情况下,JPA自动处理基本类型的映射,但可以使用此批注进行微调。 - `@Enumerated`:将枚举类型映射为...

    sample-jpa:JPA实用程序示例

    - JPA提供`@TableGenerator`和`@SequenceGenerator`等策略来生成主键,同时可以通过工具如Hibernate Tools进行数据库的反向工程,自动生成实体类。 通过"sample-jpa"项目,你可以实际操作这些概念,深入理解JPA的...

    java jap API

    - `@TableGenerator`:用于配置表生成器。 #### 直接映射(Direct Mapping) - `@Basic`:用于映射基本类型的字段。 - `@Enumerated`:用于枚举类型的字段。 - `@Temporal`:用于日期和时间类型的字段。 - `@Lob`...

    jap帮助文档

    - **`@TableGenerator`**: 配置表生成器。 #### 六、直接映射批注 - **`@Basic`**: 默认情况下,JPA为大多数基本类型自动配置一个Basic映射,此批注用于自定义这种映射。 - **`@Enumerated`**: 指定枚举类型的映射...

    hibernate-annotations-3.2.1.GA.zip

    3. @SequenceGenerator:定义序列生成器,适用于Oracle等支持序列的数据库。 4. @JoinColumn:在关联关系中,定义外键所在的列。 5. @TableGenerator:非JPA标准,但提供了更灵活的主键生成策略。 四、实体生命周期...

    EntityClass[表和视图].rar

    例如,Hibernate允许通过@Entity注解标识一个类为Entity Class,@Table注解来指定对应的数据库表名,而@TableGenerator或@Id注解用于定义主键生成策略。 4. **属性和字段映射**: Entity Class的每个属性通常对应...

    hibernate-annotations-3.4.0.GA.chm中文版

    11. **元数据注解**:@TableGenerator和@SequenceGenerator用于定义生成主键的元数据源。 通过深入学习这些注解及其用法,开发者能够熟练地在Hibernate中实现ORM,提高开发效率,减少与数据库交互的复杂度。同时,...

Global site tag (gtag.js) - Google Analytics