zoukankan      html  css  js  c++  java
  • @GeneratorValue与@GenericGenerator注解使用心得

    http://blog.csdn.net/tianxiezuomaikong/article/details/64930151

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    今天开发的时候,对于这两个注解使用情况不是很了解,所以特意在此记录下下班后自己学习的成果。 
    在进入今天的主题前,我们先来了解下,关于一些定义的解释。

    什么是JAP? 
    JPA全称Java Persistence API,其通过JDK 5.0(或以上版本)的注解或XML配置方式来描述 对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

    JPA与Hibernate的关系是怎样的? 
    JPA的总体思想和现有的Hibernate、TopLink、JDO等,这些ORM框架大体一致。 
    个人浅显的理解为,JPA给后面那些ORM开发厂商提供了一些“标准”,使得它们可以在现有的一些模板上进行互相补充,而最后开发出来的ORM产品,主要方面还是在实体对象与数据库的持久化,以及对数据库的一些CRUD操作上。

    好,下面我们来看看今天正式的内容。

    @GeneratorValue注解 
    属于一个JPA接口(从JAVA EE 5开始,存在于javax.persistence包下),其接口下包含了两个抽象的参数,GenerationType类型的strategy和String类型的generator,并且两个参数都有相应的默认值。 
    JPA


    (附图片所示页面的链接: 
    http://docs.oracle.com/javaee/5/api/javax/persistence/GeneratedValue.html )

    好的,我们继续往下了解,GenerationType中有什么样的值供我们选择,这些值分别又代表了什么意思。 
    GenerationType


    由上图我们发现,GenerationType同样也位于javax.persistence包下,并且还继承了Enum枚举类,然后其中有4个值供我们使用,分别是: 
    TABLE:使用一个特定的数据库表格来保存主键。 
    SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。 
    IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql) 
    AUTO:主键由程序控制,也是GenerationType的默认值。

    下面贴出一些使用的范例。(我比较喜欢把注解放在getter方法的上面)

    GenerationType.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)  
    public long getUserId() {
            return userId;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    GenerationType.SEQUENCE

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")
    @SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")
    public long getUserId() {
            return userId;
    }  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    GenerationType.IDENTITY

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public long getUserId() {
            return userId;
    } 
    • 1
    • 2
    • 3
    • 4
    • 5

    GenerationType.AUTO

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public long getUserId() {
            return userId;
    } 
    • 1
    • 2
    • 3
    • 4
    • 5

    四种数据库的对GeneratorValue4种策略的支持情况如下:

    mysql 
    GenerationType.TABLE 
    GenerationType.AUTO 
    GenerationType.IDENTITY 
    不支持GenerationType.SEQUENCE

    oracle 
    strategy=GenerationType.AUTO 
    GenerationType.SEQUENCE 
    GenerationType.TABLE 
    不支持GenerationType.IDENTITY

    postgreSQL 
    GenerationType.TABLE 
    GenerationType.AUTO 
    GenerationType.IDENTITY 
    GenerationType.SEQUENCE 
    都支持

    kingbase 
    GenerationType.TABLE 
    GenerationType.SEQUENCE 
    GenerationType.IDENTITY 
    GenerationType.AUTO 
    都支持


    @GenericGenerator注解

    @GenericGenerator注解是hibernate所提供的自定义主键生成策略生成器,由@GenericGenerator实现多定义的策略。所以,它要配合@GeneratedValue一起使用,并且@GeneratedValue注解中的”generator”属性要与@GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略,下面来看看hibernate的API对它的定义。 
    GenericGenerator

    @GenericGenerator支持13种策略,分别是:

    static {  
    
      GENERATORS.put("uuid", UUIDHexGenerator.class);  
    
      GENERATORS.put("hilo", TableHiLoGenerator.class);  
    
      GENERATORS.put("assigned", Assigned.class);  
    
      GENERATORS.put("identity", IdentityGenerator.class);  
    
      GENERATORS.put("select", SelectGenerator.class);  
    
      GENERATORS.put("sequence", SequenceGenerator.class);  
    
      GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);  
    
      GENERATORS.put("increment", IncrementGenerator.class);  
    
      GENERATORS.put("foreign", ForeignGenerator.class);  
    
      GENERATORS.put("guid", GUIDGenerator.class);  
    
      GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated  
    
      GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);  
    
    } 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    上面的12种策略,再加上native,一共是13种。 
    其实,这就是hibernate对JPA策略的一种拓展补充。 
    我个人用的比较多的是uuid策略,用在了oracle数据库的主键生成上,她会根据内部程序计算出32位长度的唯一id,具体使用范例如下:

    @GeneratedValue(generator = "paymentableGenerator") 
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    public String getUserId() {
            return userId;
    }
    • 1
    • 2
    • 3
    • 4
    • 5

    其他我就先不一一补充了,下面推荐两篇好文,里面说的很详细,很多迷惑的点我也参考了它们才解答出来,附上博文链接:

    http://www.cnblogs.com/tobeprogramer/p/4162228.html

    http://www.cnblogs.com/ph123/p/5692194.html

    今天就写到这儿啦! 
    学无止境,生生不息。

  • 相关阅读:
    MYSQL 5.7修改密码,登录问题
    linux 系统 cp: omitting directory 问题解决
    闭包函数是什么
    ecshop 前台个人中心修改侧边栏 和 侧边栏显示不全 或 导航现实不全
    ecshop 前台分页
    php 5.3新增的闭包语法介绍function() use() {}
    剖析 Linux hypervisor
    长久的深情能否维系
    私有云的迁移:从VMware到OpenStack
    Openstack 架构简述
  • 原文地址:https://www.cnblogs.com/ConfidentLiu/p/8120204.html
Copyright © 2011-2022 走看看