`
zhangfeilo
  • 浏览: 400990 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

jpa 表生成器 GenerationType.TABLE.

阅读更多

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

使用以下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

现在有另外两个表customercontact,它们每次新建记录时生成主键的值分别“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小节。

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

分享到:
评论

相关推荐

    04_JPA详解_第一个JPA实例与JPA主键生成策略.zip

    4. **GenerationType.TABLE**: 使用数据库中的特定表来生成主键,这种方法对多个并发的请求更安全。 5. **GenerationType.UUID**: 生成全局唯一的UUID字符串作为主键,适用于分布式系统。 6. **GenerationType....

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

    2. **TABLE(自定义表生成器)** - **概述**:`TABLE`策略通过在数据库中创建一个单独的表来管理主键值。这种方式相对独立于数据库类型,适合需要跨库生成唯一ID的场景。该策略通过`@TableGenerator`注解来配置...

    JPA的Id注解.docx

    如果没有指定,那么JPA会使用默认的生成器。 **3. 主键字段的数据类型** JPA支持多种数据类型作为主键,包括但不限于: - `int` 和 `Integer` - `long` 和 `Long` - `short` 和 `Short` - `BigInteger` - `UUID` ...

    JPA注解详解

    - `name`: 生成器的名称,必须与使用`@GeneratedValue(strategy=GenerationType.TABLE)`的`generator`属性匹配,作用域为整个持久化单元。 - `allocationSize`: 指定每次分配的主键数量,默认为50,可根据应用程序或...

    解决spring自增型主键问题

    - **GenerationType.AUTO**:由持久化管理器根据其自身的能力和配置来选择合适的主键生成策略。 ### 实践案例分析 在给定的代码片段中,可以看到一个名为`com.xxx.domain`的Java实体类中定义了字段`tectid`,并...

    表生成器 @TableGenerator

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

    1_JPA_批注参考.

    13. **@SequenceGenerator**: 配合@GeneratedValue使用,定义序列生成器,适用于Oracle、PostgreSQL等支持序列的数据库。 14. **@OrderColumn**: 在处理集合类型的关联关系时,可以指定一个顺序列来维护集合元素的...

    openjpa实体标识的生成策略

    在`strategy=GenerationType.TABLE`的情况下,实体的标识通过数据库中的特定表和字段生成。这种方式适用于不支持序列或自动增长字段的数据库,但可能会增加数据库的复杂性和开销。 在实现这些策略时,开发者需要...

    04_传智播客JPA详解_第一个JPA实例与JPA主键生成策略

    在JPA中,可以通过`@GeneratedValue`注解指定主键生成策略,如`@GeneratedValue(strategy = GenerationType.IDENTITY)`。对于不同的业务需求,选择合适的主键生成策略至关重要,因为它直接影响到数据的一致性和性能...

    使用表的id生成

    标题“使用表的id生成”涉及的是数据库管理和Java Persistence API (JPA) 中的一个关键概念:主键生成策略。在数据库表中,每个记录通常都有一个唯一的标识符,即主键,用于唯一地识别每条数据。在JPA中,有多种策略...

    JPA注解的解释和说明.pdf

    @SequenceGenerator(name="repair_seq",sequenceName="seq_repair",allocationSize=1):此注解用于定义一个序列生成器,其中name是序列生成器的名称,sequenceName是数据库中序列的名称,allocationSize定义了每次...

    JPA 批注 参考

    例如,`GenerationType.IDENTITY`表示由数据库自动生成,`GenerationType.SEQUENCE`或`GenerationType.TABLE`则涉及序列或表来生成主键。 ### 属性映射 - `@Id`:标记为主键字段。 - `@Column`:定义列名、长度、...

    JPA注解教程

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

    jpa操作mysql数据库

    如果需要自动生成主键,可以使用`@GeneratedValue`注解配合策略(如`GenerationType.IDENTITY`或`GenerationType.AUTO`)。 4. **持久化管理器(EntityManager)**:这是JPA的核心接口,负责管理实体的生命周期,...

    JPA生成方法

    在JPA中,数据持久化主要通过实体类(Entity)、实体管理器(EntityManager)和实体管理工厂(EntityManagerFactory)来实现。首先,我们需要创建一个表示数据库表的实体类,通常会使用`@Entity`注解来标记这个类,...

    JPA+Mysql.zip

    使用JPA注解如`@Entity`表示这是一个实体类,`@Table`指定对应的数据库表,`@Id`标识主键,`@GeneratedValue`指定主键生成策略。 ```java @Entity @Table(name = "users") public class User { @Id @...

    JPA注解.doc J PA注解.

    `generator`用于指定具体的生成器,例如Hibernate的uuid生成器。 5. **@Basic(fetch=FetchType, optional=true)** `@Basic`注解表示一个简单的属性映射到数据库表的字段。`fetch`参数控制属性的加载策略,`EAGER`...

    hibernate注解说明文档

    - `GenerationType.TABLE`:使用一个特定的数据库表来保存主键。 - `GenerationType.IDENTITY`:由数据库自动生成(通常为自动增长类型)。 - `GenerationType.SEQUENCE`:根据底层数据库的序列来生成主键(需要...

    JPA注解.docx

    `generator`用于指定主键生成器的名称,例如,在Hibernate中可以设置为uuid等。例如: ```java @Id @GeneratedValue(strategy=GenerationType.SEQUENCE) public int getPk() { return pk; } ``` 5. **@Basic...

Global site tag (gtag.js) - Google Analytics