hibernate主键的生成策略

目录

 

主键的分类

自然主键

代理主键

主键的生成策略


  • 主键的分类

    • 自然主键

      • 自然主键:主键本身就是表中的一个字段,实体的一个属性。
        • 创建一个人员表,人员都会有身份证号(唯一不可重复),使用身份证号做主键,这种主键成为自然主键。
    • 代理主键

      • 主键的本身不是表中必须的一个字段(不是实体中的某个具体的属性)。
        • 创建一个人员表,没有使用人员中的身份证号,用了一个与表不相关的字段ID(PNO),这种主键称为代理主键。
      • 实际开发过程中,尽量使用代理主键。
        • 一旦自然主键参与到业务中,后期有可能修改源代码。
        • 好的程序设计满足OCP原则:对程序的扩展是open的,对修改源码是close。
    • 主键的生成策略

      • hibernate的主键生成策略
        • 在实际的开发中一般不允许用户手动设置主键,一般将主键交给数据库(自动增长),或者手动编写一些程序进行设置。在hibernate中为了减少程序的编写,提供了许多的程序生成策略。
        • increment          :hibernate的自动生长机制,适用于short、int、long类型的主键。在单线程中使用。
          • 首先发送一条语句:select max(id) from 表;然后让id+1作为下一条记录的主键。(此时便会存在线程安全:比如此时线程1获取表中的id,同时线程2也获取表中的相同id,线程1将id+1作为记录的主键,线程2将id+1作为记录的主键,当两线程将记录插入表中,便会出现冲突)。
        • identity              :适用于short、int、long类型的主键,使用的是数据库底层的数据自动增长机制。当然适用于有数据增长机制的数据库,比如MySQL、SqlServer,但是Oracle不适用(Oracle使用的是序列增长机制)。
        • sequence         :适用于short、int、long类型的主键,采用序列增长的机制,适用于Oracle。像MySQL不能使用sequence。
        • uuid                  :Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。适用于字符串类型的主键。使用hibernate的随机方式生成字符串主键。
        • native               :本地策略,可以在identity和sequence之间自动的切换。
        • assigned          :主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。
        • foreign             :使用另外一个相关联的对象的主键作为该对象主键。很少使用,用于一对一关系中。
          <id name="id" column="id">
          
          <generator class="foreign">
          
          <param name="property">user</param>
          
          </generator>
          
          </id>

          <one-to-one name="user" class="domain.User" constrained="true" />

          该例使用domain.User的主键作为本类映射的主键。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值