zoukankan      html  css  js  c++  java
  • Hibernate的ID主键生成策略

    ID生成策略(一)
    • 通过XML配置实现ID自己主动生成(測试uuid和native)

    之前我们讲了除了通过注解的方式来创建一个持久化bean外。也能够在须要持久化的bean的包路径下创建一个与bean同样名字的hbm.xml文件来实现同样的功能!

    比如:

    User.hbm.xml文件配置:

    我们能够通过在id下指定<generator>来实现ID自己主动生成:
    <generator>的使用:
    class指向一个标识生成器。用于生成主键字段,下面是hibernate提供的几种经常使用的生成器:
    identity
    对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。

    返回的标识符是long, short 或者int类型的。


    sequence
    在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence), 而在Interbase中使用生成器(generator)。返回的标识符是long, short或者 int类型的。
    uuid(一个世界上唯一的字符串)
    uses a 128-bit UUID algorithm to generate identifiers of type string that are unique within a network (the IP address is used). The UUID is encoded as a string of 32 hexadecimal digits in length.
    native(依据数据库的不同将会选择不同的方式)
    selects identity, sequence or hilo depending upon the capabilities of the underlying database.
    实验(uuid的使用):

    測试,不须要为主键ID设置值:
    查看建表语句以及数据库数据:


    实验(native的使用):
    使用native生成的主键是一个数字,这个时候User的id属性应该是int类型的。

    查看建表语句以及数据库数据:

    ID生成策略(二)

    • 通过注解配置实现ID自己主动生成

    通过给主键字段加入@GeneratedValue注解也能够指定主键的自己主动生成策略。
    查看注解源代码,该注解默认值为AUTO,它的作用事实上就相当于xml配置中的native。



    查看建表语句以及数据库数据


    查看源代码。@GeneratedValue注解还有其它3种取值:

    • AUTO – 能够是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库。
    • TABLE – 使用表保存id值。
    • IDENTITY – identity column。指定支持IDENTITY的数据库使用,不支持使用SEQUENCE的数据库。比方MYSQL。

    • SEQUENCE – sequence指定支持SEQUENCE的数据库使用,不支持使用IDENTITY的数据库,比方ORACLE。

    默认情况下,在使用SEQUENCE的情况下。不同的表使用同一个SEQUENCE:hibernate_sequence。若我们须要为表指定单独的sequence,我们须要使用注解 @SequenceGenerator !


    name属性是sequence生成器的名字,sequenceName是生成的sequence的名字。



    然后我们能够在实体类中指定主键使用该生成器生成sequence:

    通过注解@TableGenerator生成主键(跨数据库平台):
    这个注解的作用是生成一张中间表来为其它业务表创建主键,当业务表从中获取了一个主键,它将创建一个新的主键等待获取。
    name:该生成器的名字。


    table:生成的表的表名(id_create_table),这个表包括字段(table_name,table_id),table_name做为键值对的键值,存pkColumnValue的值(EVENT),allocationSize指定主键自增1;

    使用:




    ID生成策略(三)

    • 通过XML配置实现联合主键

    有的时候我们须要将一个实体的2个或多个字段联合起来作为主键,就是说,不能有2个或多个对象的这几个字段值都同样的情况发生。
    如今我们要将Dream字段的id和name字段联合作为主键:
    作为主键的字段需单独放到一个实体中,该实体须实现java.io.Serializable,重写equals和hashCode方法。
    Dream 包括主键实体的引用:
    XML配置联合主键:

    执行:



    • 通过注解配置实现联合主键(3种方式)
    将组件类注解为@Embeddable,并将组件的属性注解为@Id:

    将组件的属性注解为@EmbeddedId:
    将类注解为@IdClass,并将该实体中全部属于主键的属性都注解为@Id:

  • 相关阅读:
    31天重构指南之二十:提取子类
    31天重构指南之二十二:分解方法
    大叔手记(17):大叔2011年读过的书及2012年即将要读的书
    深入理解JavaScript系列(5):强大的原型和原型链
    深入理解JavaScript系列(10):JavaScript核心(晋级高手必读篇)
    深入理解JavaScript系列(11):执行上下文(Execution Contexts)
    深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP
    深入理解JavaScript系列(4):立即调用的函数表达式
    深入理解JavaScript系列(3):全面解析Module模式
    深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5091714.html
Copyright © 2011-2022 走看看