• 攻城狮在路上(壹) Hibernate(四)--- 对象标识符(OID)生成机制


       Hibernate使用对象标识符(OID)来建立内存中对象和数据库表中记录的对应关系,对象的OID和数据库的主键对应。为了保证OID的唯一性和不可变性,应该让Hibernate来为OID赋值。Hibernate通过标识符生成器来为OID赋值。


    一、指定标识符生成器
      使用<id>元素的子元素<generator class="increment"/>来指定。Hibernate提供的内置标识符生成器:

    A、increment:适用于代理主键。由Hibernate自动以递增的方式生成标识符。
    B、identity:适用于代理主键。由底层数据库生成。前提条件是底层数据库支持自动增长字段类型,比如:DB2MySQLMS SQL ServerSybaseHypersonicSQL.
    C、sequence:适用于代理主键。由底层数据库的序列生成。前提是底层数据库支持序列。如:DB2PostgreSQLOracleSAP DB;
    D、hilo:适用于代理主键。Hibernate根据highlow算法生成标识符。
    E、native:适用于代理主键。根据底层数据库对自动生成标识符的支持能力,来选择identity、sequence或hilo.
    F、uuid.hex:适用于代理主键。Hibernate采用128位的UUID算法来生成。
    G、assigned:适用于自然主键。由Java程序指定。
    H、select:适用于遗留数据库中的代理主键或者自然主键。由数据库中的触发器来生成标识符。(具体机制不清楚)
    I、foreign:(暂不了解)

    二、increment标识符生成器
      Hibernate在插入记录时首先执行以下select max(id) from tableName;来获取当前最大的id值,然后在此基础上按照增量增加。
      该机制在并发操作时可能会出现要插入的多条记录id值相同的情况,所以此种方式仅仅在只有单个Hibernate应用进程访问数据库的情况下才能有效工作。其他的涉及到并发插入的情况也会失效。
      适用场景

    A、由于该机制生成标识符不依赖于底层数据库,因此适合于所有的数据库系统。
    B、适用于只有单个Hibernate应用进程访问同一个数据库的场合(多线程应该也会失效),集群环境下不推荐使用。
    C、OID必须为long、int或short类型。

    三、identity标识符生成器
      该机制要求底层数据库把主键定义为自动增长的字段类型。
      适用场景

    A、底层数据库支持自动增长类型的字段。
    B、OID必须为long、int或short类型。

    四、sequence标识符生成器
      适用场景

    A、底层数据库必须支持序列。
    B、OID必须为long、int或short类型。

    五、hilo标识符生成器
      适用场景

    A、由于该机制生成标识符不依赖于底层数据库,因此适合于所有的数据库系统。
    B、OID必须为long、int或short类型。
    C、highlow算法生成的标识符只能在一个数据库中保证唯一。

    六、映射复合自然主键
      配置文件示例

    <composite-id>
                <!-- key-property标签表示哪一些属性对应复合主键 -->
                <key-property name="id" column="id" type="string"></key-property>
                <key-property name="name" column="name" type="string"></key-property>
    </composite-id>

      Java代码示例

    Customer cu = new Customer();
    cu.setName("Tom");
    cu.setCompanyId(1L);
    session.get(Customer.class,cu);

      说明
      要使上面session的get()方法生效,要求Customer必须实现Serializable接口,且重写equals()和hashcode()方法。

     七、总结

    MySQL:indentityincrementhilo
    ative
    MS SQL Server:identityincrementhilo
    ative
    Oracle:sequenceseqhilohiloincrement
    ative
    跨平台开发:native
    

      


    声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。

  • 相关阅读:
    【Java/OS】取得系统的临时目录
    010CH32V307(WCH单片机)学习开发新建工程
    2STM32+ESP8266+Air302远程升级篇(自建物联网平台)STM32通过air302使用http下载程序文件,升级程序(单片机程序轮训检查更新)
    100CH32V307(WCH单片机)学习开发GPIO输出高低电平
    101CH32V307(WCH单片机)学习开发GPIO电平检测,引脚中断
    Leetcode 222. 完全二叉树的节点个数(中等)
    Leetcode 450. 删除二叉搜索树中的节点(中等)、701. 二叉搜索树中的插入操作(中等)、700. 二叉搜索树中的搜索(简单)、98. 验证二叉搜索树(中等)
    Leetcode 341. 扁平化嵌套列表迭代器(中等)
    Leetcode 797. 所有可能的路径(中等)
    Leetcode 96. 不同的二叉搜索树(简单) 95. 不同的二叉搜索树II(中等)
  • 原文地址:https://www.cnblogs.com/tq03/p/3746580.html
Copyright © 2020-2023  润新知