8 对象关系映射

8.1 Introduction

建立域模型和关系数据模型有着不同的出发点:

  • 域模型: 由程序代码组成, 通过细化持久化类的的粒度可提高代码的可重用性, 简化编程
  • 在没有数据冗余的情况下, 应该尽可能减少表的数目, 简化表之间的参照关系, 以便提高数据的访问速度

Hibernate 把持久化类的属性分为两种:

  • 值(value)类型: 没有 OID, 不能被单独持久化, 生命周期依赖于所属的持久化类的对象的生命周期(没有hbm.xml配置文件)
  • 无法直接用 property 映射 值类型(自定义对象类型) 属性
  • Hibernate 使用 元素来映射组成关系, 该元素表名 pay 属性是 Worker 类一个组成部分, 在 Hibernate 中称之为组件

参考:

  1. <project-name>/src/main/java/cn.jxzhang.hibernate/entities/Programmer.java
  2. <project-name>/src/main/java/cn.jxzhang.hibernate/entities/Programmer.hbm.xml
  3. <project-name>/src/main/java/cn.jxzhang.hibernate/entities/Salary.java

8.2 Unidirectional associations

8.2.1 Many-to-one

A unidirectional many-to-one association is the most common kind of unidirectional association.

  • 单向 n-1 关联只需从 n 的一端可以访问 1 的一端
    • 域模型: 从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Customer 属性, 而在 Customer 类中无需定义存放 Order 对象的集合属性
    • 关系数据模型:ORDERS 表中的 CUSTOMER_ID 参照 CUSTOMER 表的主键
  • 显然无法直接用 property 映射 customer 属性
  • Hibernate 使用 元素来映射多对一关联关系