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

    对于不同的数据库和应用程序,主键的生成方式往往不同

    Hibernate的主键生成策略分为3大类:Hibernate对主键id附值,应用程序对主键id附值,由数据库对id附值

       1.Hibernate对主键id附值:

             increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。

      这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,由于各个实例各自维护主键状态,不同实例可能产生同样的主键,从而造成主键重复的异常。因此,如果同            一个数据库有多个实例访问,这种方式应该避免使用

       2.应用程序对主键id附值:即编程人员自己对主键id附值或者使用相关联对象的主键

           foreign: 使用另外一个相关联的对象的主键。通常和<one-to-one>联合起来使用。

         assigned:应用程序自身对id附值。当在xml中设置<generator class="assigned"> 或者用annotation来设置(hibernate提供了多种生成器供选择,基于Annotation的方式通过@GenericGenerator实现,通过@GenericGenerator来提供一个id生成器)

                       @GeneratedValue(generator="paymentableGenerator")

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

    这样指定后,编程人员就应该自己负责主键id的负值

       3.由数据库对id附值:即你所用的数据库:eg,SQL Server2008,Oracle,MySQL它们来负责对主键id负值

             native: 对于 oracle 采用 Sequence 方式对主键id负值,对于MySQL 和 SQL Server 采用identity(自增主键生成机制,生成整型的id),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)。 

             identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,对于Oracle要设定sequence(MySQL 和 SQL Server 中很常用)。 
              等同于JPA中的INDENTITY。 

             sequence: 使用Oracle数据库的主键id生成策略,调用底层数据库的序列来生成主键,要设定序列名,不然hibernate无法找到。

             uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型),适用于主键为String类型的

     

  • 相关阅读:
    在Fedora 8 下安装Fcitx输入法
    iisweb服务器完美解决方案
    利用httpget实现计划任务访问某一指定页面
    如何升级到SQL Server 2005
    排除“计算机默认 权限设置未将 COM 服务器应用程序”的错误
    Windows 2003 服务器安全设置
    Linux Fedora8 下安装 IE6
    配置 SQL Server 以便使用 2 GB 以上的物理内存(包括SQL Server 2005)
    Entity Framework初探
    async、await在ASP.NET[ MVC]中之线程死锁的故事
  • 原文地址:https://www.cnblogs.com/SpringSmallGrass/p/3001948.html
Copyright © 2011-2022 走看看