快速业务通道

将遗留Hibernate应用程序迁移到OpenJPA和EJB 3.0(二) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

将遗留Hibernate应用程序迁移到OpenJPA和EJB 3.0(二)

时间:2011-09-18 Donald Vines

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 中,一对多(单向)关系按照以下方式进行映射:

在父类中,将设置、包或列表与一对多子元素一起使用。

如果关系是单向的,则在表示子类的表中创建外键;否则,使用双向关系的多对一关系。

将遗留Hibernate应用程序迁移到OpenJPA和EJB 3.0(二)(2)

时间:2011-09-18 Donald Vines

映射 14. 一对多关系(Hibernate XML 映射)

<!-- Address (parent) class --> <class name="Address" table="T_ADDRESS">   <id name="addressId" column="ADDR_TID"/>   <set    name="phones"            table="T_PHONE"    cascade="all-delete- orphan">    <key column="ADDR_TID"/>    <one-to-many class="Phone">   </set> </class> <!-- Phone (child) class -- > <class name="Phone" table="T_PHONE">   ... </class>

务必注意 Hibernate 中的专有 cascade="all-delete-orphan" 功能(请参见映射 14)。使用此属性 使您能够从数据库删除子对象,方法是直接从父集合中移除它,然后将父对象保存到数据库。使用此专有 功能,不在代码中显式删除子对象。尽管在标准 JPA 中没有任何等效功能,但 OpenJPA 中的专有 @ElementDependent 注释提供了自动孤立项清除功能,但是此功能不可移植到其他持久性提供程序,并且 在取读代码时可导致混淆。接下来将详细讨论 all-delete-orphan 功能。

OpenJPA 约定

在 OpenJPA 中,您无法使用外键映射一对多单向关系,您必须使用连接表映射

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号