hibernate使用jpa进行注解开发

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

什么是JPA? 
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策略具体介绍
  • Hibernate 默认总共支持 13 种生成策略 : 

    1. increment        2.  identity        3. sequence

    4. hilo                  5. seqhilo         6. uuid

    7. uuid.hex          8. guid             9. native

    10. assigned       11. select         12. foreign        13. sequence-identity

     

    下面介绍几个较为常用的策略 : 

    ① identity [ 自然递增 ]

             支持 DB2,MySQL,SQL Server,Sybase 和HypersonicSQL 数据库, 用于为 long 或 short 或 int 类型生成唯一标识。它依赖于底层不同的数据库,
           与 Hibernate 和 程序员无关。

    注解示例 : 

    @Id

    @GenericGenerator(name = "idGenerator", strategy = "identity")

    @GeneratedValue(generator = "idGenerator")

     

    ② sequence [ 序列 ]

    支持 Oracle,DB2,PostgreSql,SAPDb 等数据库,用于为 long 或 short 或 int 类型生成唯一标识。它需要底层数据库的支持,
           并由数据库来维护这个 sequence 序列。

    注解示例 : 

    @Id

       @GenericGenerator(name = "idGenerator", strategy = "sequence",

    parameters = {@Parameter(name = "sequence",value="seq_name")})

       @GeneratedValue(generator = "idGenerator")

    注意 : 该策略要求设定序列名,否则 hibernate 将无法找到,这将引致抛出异常 :

    org.hibernate.exception.SQLGrammarException: could not get next sequence value

     

    ③ native

             需底层数据库的支持,对于 MySQL,SQL Server 采用 identity 的生成策略,对于 Oracle,则采用 sequence 策略。

    注解示例 :

    @Id

       @GenericGenerator(name = "idGenerator", strategy = "native")

       @GeneratedValue(generator = "idGenerator")

     

    ④ increment [ 自然递增 ]

           与 identity 策略不同的是,该策略不依赖于底层数据库,而依赖于 hibernate 本身,用于为 long 或 short 或 int 类型生成唯一标识。
           主键计数器是由 hibernate 的一个实例来维护,每次自增量为 1,但在集群下不能使用该策略,
           否则将引起主键冲突的情况,该策略适用于所有关系型数据库使用。

    注解示例 :

           @Id

       @GenericGenerator(name = "idGenerator", strategy = "increment")

       @GeneratedValue(generator = "idGenerator")

     

    ⑤ uuid [ 32位16进制数的字符串 ]

             采用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
           uuid 最终被编码成一个32位16进制数的字符串,
           占用的存储空间较大。用于为 String 类型生成唯一标识,适用于所有关系型数据库。

    注解示例 :

           @Id

       @GenericGenerator(name = "idGenerator", strategy = "uuid")

       @GeneratedValue(generator = "idGenerator")

     

    ⑤ assigned [ 手工分配主键ID值 ]

           该策略要求程序员必须自己维护和管理主键,当有数据需要存储时,程序员必须自己为该数据分配指定一个主键ID值,
           如果该数据没有被分配主键ID值或分配的值存在重复,则该数据都将无法被持久化且会引起异常的抛出。

    注解示例 :

           @Id

       @GenericGenerator(name = "idGenerator", strategy = "assigned")

       @GeneratedValue(generator = "idGenerator")


  • 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

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

猜你喜欢

转载自blog.csdn.net/liao0801_123/article/details/80117592
今日推荐