Hibernate映射文件

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
image_1b346btk31o238fa1j1u1j61n049.png-84.1kB
 
class
image_1b346dve91mo81m0d17un1uhvcrpm.png-87.6kB
 
 
在介绍下面的节点之前先来介绍一下映射对象标识符

  • Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系,对象的OID和数据表的主键对应,Hibernate通过标识符生成器来为主键赋值。
  • Hibernate 推荐在数据表中使用代理主键,即不具备业务含义的字段,代理主键通常为整数类型,因为整数类型比字符串类型要节省更多的数据库空间。
  • 在对象-关系映射文件中, <id>元素用来设置对象标识符. <generator>子元素用来设定标识符生成器。
  • Hibernate提供了标识符生成器接口:IdentifierGenerator,并提供了各种内置实现。
     
    id
    image_1b346frg8kpu1uui1vcf16961fk313.png-51.2kB
     
    generator
    image_1b346ha6bv66hht1vk9bku10fa1g.png-8.4kB
     
    下面是hibernate提供的内置标识符生成器:
    image_1b346u22q660j8g1igs1mt81k1n2n.png-63.5kB  
  • increment 标识符生成器
    increment标识符生成器由Hibernate以递增的方式为代理主键赋值,Hibernate会先读取NEWS表中的主键的最大值,而接下来向NEWS表中插入记录时,就在max(id)的基础上递增,增量为 1。
    适用范围:
      由于increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。
      适用于只有单个Hibernate应用进程访问同一个数据库的场合, 在集群环境下不推荐使用它。(并发问题)
      OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出异常 。

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

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

  • hilo 标识符生成器
    hilo标识符生成器由Hibernate按照一种“high/low”算法生成标识符。
    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类型,在运行时会抛出异常。
     
    property
    image_1b348es521kk81fev41b1q5m38j34.png-205.5kB
    image_1b348ggd013651lsckqg1ptc1sa03h.png-130.5kB

  • 派生属性:
    并不是持久化类的所有属性都直接和表的字段匹配,持久化类的有些属性的值必须在运行时通过计算才能得到,这种属性称为派生属性,下面我们使用property的formular属性来测试派生属性:
    首先在News.java中添加一个desc字段:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //该属性值为: title:author
    private String desc;
    public String getDesc() {
    return desc;
    }
    public void setDesc(String desc) {
    this.desc = desc;
    }

然后在News的映射文件中映射派生属性:

1
2
<!-- 映射派生属性 -->
<property name="desc" formula="(SELECT concat(author, ': ', title) FROM NEWS n WHERE n.id = id)"></property>

测试:

1
2
3
4
5
6
@Test
public void testFormula(){
News news = (News) session.get(News.class, 1);
System.out.println(news.getDesc());
}

运行结果:

image_1b34a68661rcq12o4ms3147m1rae3u.png-66.5kB