快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
ascadeType.ALL 属性,并更改源代码,不仅从父集合中移除子对象,而且从数据库中显式删除 子对象;例如,不需要类似于以下的代码:

public class Address implements Serializable {   ...   public void removePhone(Phone p) {    this.phones.remove(p); // Explicitly remove p from the set; which                // Implicitly deletes p from the database   } }

您应使用类似于以下的代码替换它:

public class Address implements Serializable {   ...   public void removePhone(Phone p) {    // Explicitly remove p from the set     this.phones.remove(p);        // Explicitly delete p from the database     ORMHelper.getCurrentSession().delete(p);   } }

OpenJPA

cascade=CascadeType.ALL

尽管上面的 Hibernate 示例仅指定了从父对象到子对象的级联操作,但是在使用 OpenJPA 持久性提 供程序测试此映射时,我们必须将 cascade=CascadeType.ALL 定义为两个方向,并在 OneToMany 注释和 ManyToOne 注释中指明。通常,您不需要从子对象到其父对象的级联操作(在 ManyToOne 注释中),但 是这对于使从父对象到子对象的 merge() 级联操作能够工作是必需的。

如果不按两个方向定义级联操作,则 remove() 和 persist() 的级联操作将从父 Address 对象到其 依赖的 Phone 对象进行,但是 merge() 的级联操作会引发异常,指示依赖对象中的 Phone.address 字 段不允许级联。

(这是当前正在使用的 OpenJPA v0.9.7 中的已知问题,在以后的版本中会修复该问题。与此同时, 解决办法是按两个方向启用级联。)

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

时间:2011-09-18 Donald Vines

d. 多对多关系

多对多关系通过映射表定义到对象集合的引用。在对象模型中,多对多关系并不是全部通用的,但是 它们通常是双向的。

与其他双向关系一样,存在所属端和非所属端。在这种情况下,所属端拥有映射表,而不是外键。可 以将任意一端指定为所属端;选取哪一端并不重要。

对象模型

映射 16. 多对多关系 (POJO)

// Group (non-owner/parent) entity public class Group implements Serializable {   private Long groupId;   private Set users = new HashSet();   ... } // User (owner/child) entity public class User implements Serializable {    private Long userId;   private Set groups = new HashSet();   ... }

Hibernate 约定

在 Hibernate 中,多对多关系按照以下方式进行映射:

非所有者将集合(设置、包或列表)元素与 inverse="true" 属性、表属性、键子元素和多对多子元 素一起使用。

关系所有者将集合(设置、包或列表)元素与表属性、键子元素和多对多子元素一起使用。

映射 17. 多对多关系(Hibernate XML 映射)

<!—Group (non-owner/parent) class --> <class name="Group" table="T_GROUP">   <id name="groupId" column="GROUP_TID"/>   <set name="users" table="T_USER_GROUP" inverse="true">     <key column="GROUP_TID"/>     <many-to-many column="USER_TID" class="User"/>   </set> </class> <!—User (owner/child) class --> <class name="User" table="T_USER">   <id name="userId" column="USER_TID"/>    <set name="groups

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号