zoukankan      html  css  js  c++  java
  • Hibernate4.x之映射文件

    POJO类和数据库的映射文件*.hbm.xml
      POJO类和关系数据库之间的映射可以用一个XML文档来定义
      通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据库表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系
      在运行时Hibernate将根据这个映射文件来生成各种SQL语句
      映射文件的扩展名为.hbm.xml

    映射文件说明
      hibernate-mapping
      -类层次:class
        主键:id
        基本类型:property
        实体引用类:many-to-one | one-to-one
        集合:set | list | map | array
        - one-to-many
        - many-to-many
        子类:subclass | joined-subclass
        其它:component | any等
      -查询语句:query(用来放置查询语句,便于对数据库查询的统一管理和优化)


    每个Hibernate-mapping中可以同时定义多个类。但更为推荐为每个类都创建一个单独的映射文件


    映射对象标识符

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

    主键生成策略generator
    Hibernate提供的内置标识符生成器
    ---------------------------------------------------------------------------------------------

    increment:适用于代理主键,有Hibernate自动以递增的方式生成
    identity:适用于代理主键,有底层数据库生成标识符
    sequence:适用于代理主键,Hibernate根据底层数据库的序列生成标识符,这要求数据库支持序列
    hilo:适用于代理主键,Hibernate分局high/low算法生成标识符
    seqhilo:适用于代理主键,使用一个高/低位算法来高效的生成long,short或int类型的标识符
    native:适用于代理主键,根据底层数据库对自动生成标识符的方法,自动选择identity、sequence或hilo
    uuid-hex:适用于代理主键,Hibernate采用采用120为的UUID算法生成标识符
    uuid-string:适用于代理主键,UUID被编码成一个16字符长的字符串
    assigned:适用于自然主键,由Java应用程序负责生成标识符
    foreign:适用于代理主键,使用另外一个相关联的对象的标识符
    ---------------------------------------------------------------------------------------------
    increment标识符生成器
      increment标识符生成器由Hibernate以递增的方式为代理主键赋值
      Hibernate会先读取NEWS表中的主键的最大值,而接下来向NEWS表中插入记录时,就在max(id)的基础上递增,增量为1
      

      适用范围:
        由于increment生成标识符机制不依赖与底层数据库系统,因此它适用于所有的数据库系统
        适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用它
        OID必须为long、int或short类型,如果把OID定位byte类型,在运行时会抛出异常

    identity标识符生成器
      identity标示符生成器有底层数据库来负责生成标识符,它要求底层数据库把主键定义为自动增长字段类型
      

      适用范围:
        由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增加字段类型。支持自动增长字段类型的数据库包括:DB2、MySQL、MS SQL SERVER、Sybase等
        OID必须为long、int或short类型,如果把OID定位byte类型,在运行时会抛出异常

    sequence标识符生成器
      sequence标识符生成器利用底层数据库提供的序列来生成标识符
      

    1 <id name="id">
    2     <generator class="sequence">
    3         <param name="sequence">news_seq</param>
    4     </generator>
    5 </id>    


      Hibernate在持久化一个News对象时,先从底层数据库的news_seq序列中获得一个唯一的标识号,再把它作为主键值
      适用范围:
        由于sequence生成标识符的机制依赖于底层数据库的序列,因此,要求底层数据库必须支持序列,支持序列的数据库包括:DB2、Oracle等
        OID必须为long、int或short类型,如果把OID定义为byte类型,在运行时会抛出异常

    hilo标识符生成器
    hilo标识符生成器由Hibernate按照一种high/low算法生成标识符,它从数据库的特定表的字段获取中high值

    1 <id name="id">
    2     <generator class="hilo">
    3         <param name="table">HI_TABLE</param>
    4     <param name="column">NEXT_VALUE</param>
    5     <param name="max_lo">10</param>
    6     </generator>
    7 </id>


      Hibernate在持久化一个News对象时,有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类型,在运行时会抛出异常

    -----------------------------------
    Java时间和日期类型的Hibernate映射
    在Java中,代表时间和日期的类型包括:java.util.Date和java.util.Calendar。此外,在JDBC API中还提供了3个扩展了java.sql.Date,java.sql.Time,和java.sql.TimeStamp,这三个类非别和标准SQL类型中的DATE,TIME和TIMESTAMP类型对应
    在标准SQL中,DATE类型表示日期,TIME类型表示时间,TIMESTAMP类型表示时间戳,同时包含日期和时间信息

    -------------------------------------------------------------------------
    映射类型 Java类型 标准SQL类型 描述
    date java.util.Date或java.sql.Date DATE 代表日期yyyy-MM-dd
    time java.util.Date或java.sql.Time TIME 代表时间 hh:mm:ss
    timestamp java.util.Date或java.sql.Timestamp TIMESTAMP 代表时间和日期 yyyy-MM-dd hh:mm:ss
    calendar java.util.Calendar TIMESTAMP 代表时间和日期 yyyy-MM-dd hh:mm:ss
    calendar_date java.util.Calendar DATE 代表日期yyyy-MM-dd
    -------------------------------------------------------------------------

  • 相关阅读:
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Python eval() 函数
    Python repr() 函数
  • 原文地址:https://www.cnblogs.com/dreamfree/p/4122116.html
Copyright © 2011-2022 走看看