zoukankan      html  css  js  c++  java
  • JPA中的主键生成策略

    通过annotation(注解)来映射hibernate实体的,基于annotationhibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id@GeneratedValue都是JPA的标准用法。

    JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO

    具体说明如下:

    IDENTITY:主键由数据库自动生成(主要是自动增长型)

    用法:

        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        private Long custId;

    SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。

    用法:

     @Id  
        @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")  
        @SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")  
    private Long custId;
    
    
        //@SequenceGenerator源码中的定义
        @Target({TYPE, METHOD, FIELD})   
        @Retention(RUNTIME)  
        public @interface SequenceGenerator {  
           //表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中
           String name();  
           //属性表示生成策略用到的数据库序列名称。
           String sequenceName() default "";  
           //表示主键初识值,默认为0
           int initialValue() default 0;  
           //表示每次主键值增加的大小,例如设置1,则表示每次插入新记录后自动加1,默认为50
           int allocationSize() default 50;  
        }

    AUTO:主键由程序控制

    用法:

     @Id  
     @GeneratedValue(strategy = GenerationType.AUTO)  
     private Long custId;

    TABLE:使用一个特定的数据库表格来保存主键

    用法:

        @Id  
        @GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")  
        @TableGenerator(name = "pk_gen",  
            table="tb_generator",  
            pkColumnName="gen_name",  
            valueColumnName="gen_value",  
            pkColumnValue="PAYABLEMOENY_PK",  
            allocationSize=1  
        ) 
        private Long custId;

    //@TableGenerator的定义:

        @Target({TYPE, METHOD, FIELD})   

        @Retention(RUNTIME)  

        public @interface TableGenerator {  

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

          String name();  

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

          String table() default "";  

          //catalogschema具体指定表所在的目录名或是数据库名

          String catalog() default "";  

          String schema() default "";  

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

          String pkColumnName() default "";  

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

          String valueColumnName() default "";  

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

          String pkColumnValue() default "";  

          //表示主键初识值,默认为0

          int initialValue() default 0;  

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

          int allocationSize() default 50;  

          UniqueConstraint[] uniqueConstraints() default {};  

        }

     

        //这里应用表tb_generator,定义为 :

        CREATE TABLE  tb_generator (  

          id NUMBER NOT NULL,  

          gen_name VARCHAR2(255) NOT NULL,  

          gen_value NUMBER NOT NULL,  

          PRIMARY KEY(id)  

        )

  • 相关阅读:
    struts2的@Result annotation 如何添加params,并且在页面取值
    spring @Entity @Table
    @Results( 中 params 怎么用
    Java三种技术架构
    python 内存管理
    wxpyhon 鼠标事件例子
    常用wxPython事件描述
    wxpython 拖动界面时进入假死状态(未响应)解决方法
    python 的一些高级编程技巧
    python 访问器@property的使用方法
  • 原文地址:https://www.cnblogs.com/yangzhixue/p/12348552.html
Copyright © 2011-2022 走看看