zoukankan      html  css  js  c++  java
  • sgg_(9_10)_hibernate配置文件详解

    一、class

      

    二、对象映射标识符  

      hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系,对象的OID和数据库表的主键对应,hibernate通过标识符生成器来为主键赋值
      hibernate推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间。
      在对象-关系映射文件中,<id>元素用来设置对象标识符,<generator>子元素用来设定标识符生成器。
      hibernate提供了标识符生成器接口:IdentifierGenerator,并提供了各种内置实现

      

      

    hibernate中主键的生成策略:
      1.increment标识符生成器由Hibernate以递增的方式为代理主键赋值
      2.Hibernate会先读取表中的主键的最大值,而接下来向表中插入记录时,就在max(id)的基础上递增,增量为1.
      使用范围:
      由于increment生成的标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。
      适用于只有单个hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用它。
      OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。
      测试用线程挂起的方式测出两个线程取得同一个id然后插入失败!  

      identity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型
      使用范围:
      由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型,支持自动增长字段类型的数据库包括:DB2,Mysql,SQL SERVER,Sybase等。oracle中不支持递增。
      OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常  

      sequence标识符生成器
      sequence标识符生成器利用底层数据库提供的序列来生成标识符。
      hibernate在持久化一个对象时,先从底层数据库的new_seq(代表可自定义的sequence名字)序列中获得一个唯一的标志号,再把它作为主键值
      使用范围:
      由于sequence生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列,支持序列的数据库包括:OD2,Oracle等
      OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

      

       

    hilo标识符生成器
    hilo标识符生成器由hibernate按照一种high/low算法生成标识符,它从数据库的特定表的字段中获取high值。
    <id name="id">
    <generator class="hilo">
    <param name="table">HI_TABLE</param>
    <param name="column">NEXT_VALUE</param>
    <param name="max_lo">10</param>
    </generator>
    </id>
    hibernate在持久化一个对象时,由hibernate负责生成主键值,hilo标识符生成器在生成标识符时,需要读取并修改HI_TABLE表中的NEXT_VALUE值。
    使用范围
    由于hilo生成标识符机制不依赖与底层数据库系统,因此它适合所有的数据库系统
    OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

    native标识符生成器
    native标识符生成器依据底层数据库对自动生成标识符的支持能力来选择使用identity,sequence或hilo标识符生成器。
    使用范围:
    由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此很适合于跨数据库平台开发
    OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常。

      

      

      

     -----------------------------------------------------------------------------------------------------------------------------------------------------

      

    如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

  • 相关阅读:
    python中__init__和__call__的区别
    scrapy在start_requests中传入参数给parser
    crawl: error: Unrecognized output format 'json''
    判断一个点是否在多边形区域内部 / 判断一个给定位置是否位于某个城市内部
    scrapy爬取页面不完全的解决办法
    module 'tensorflow._api.v2.train' has no attribute 'rmspropoptimizer'
    tf.image.resize处理后的图片无法使用plt.imshow正常显示
    如何将tensor大于某个值为1,小于某个值为0
    Blas GEMV launch failed: m=3, n=10000
    sql 批量插入 insert
  • 原文地址:https://www.cnblogs.com/aeon/p/10842287.html
Copyright © 2011-2022 走看看