c. 一对多关系
一对多关系定义到对象集合的引用。由于用例通常需要从父对象到子对象的遍历,而可能需要(也可 能不需要)从子对象到父对象的遍历,所以一对多关系是对象模型中最常见的关系类型;这意味着单向一 对多关系可以满足大多数情况。
也就是说,如果用例需要从子对象到父对象的遍历,则可以在子类中方便地添加多对一关系,使之成 为双向关系。
声明一对多关系的实体是父对象(并且是非所有者)。此实体的表定义主键,但是它没有外键(外键 在子对象中)。
此一对多关系引用的对象是子对象和关系的所有者。子对象具有外键,并引用父对象的主键。
在 Hibernate 中,一对多关系的映射通常是通过将列添加到外键的子表完成的,但映射的详细内容是 不同的,具体取决于是单向一对多关系,还是双向一对多关系。
在单向关系中,子表中的外键列不会映射到子对象中的属性,它在数据模型中,而不是在对象模型中 。由于是单向的,所以仅在父对象中有属性,而子对象中没有。此外,必须将外键列定义为可以为空,因 为 Hibernate 将首先插入子行(使用 NULL 外键),并在以后更新它。
在双向关系中,对象关系映射比较好,因为子对象中有一个用于外键列的属性,在数据库中该列不必 为空。但是,结果对象模型在对象之间有循环依赖关系和更紧密的耦合关系,并需要其他编程来设置关系 的两端。
可以看出,关于一对多关系的定义,有多个要考虑的权衡因素,但是通常建议使用单向关系,除非用 例指示需要用两个方向导航。
对象模型
映射 13. 一对多关系 (POJO)
// Address (parent) entity
public class Address implements Serializable {
private Long addressId;
private Set phones = new HashSet();
...
}
// Phone (child) entity
public class Phone implements Serializable {
...
}
Hibernate 约定
在 Hibernate 中,一对多(单向)关系按照以下方式进行映射:
在父类中,将设置、包或列表与一对多子元素一起使用。
如果关系是单向的,则在表示子类的表中创建外键;否则,使用双向关系的多对一关系。