CoreJava-10 Hibernate关系映射._第1页
CoreJava-10 Hibernate关系映射._第2页
CoreJava-10 Hibernate关系映射._第3页
CoreJava-10 Hibernate关系映射._第4页
CoreJava-10 Hibernate关系映射._第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hibernate IBM 高科教育中心高科教育中心 3. 映射一对多关联关系映射一对多关联关系 创建具有一对多参照关系的关系模型创建具有一对多参照关系的关系模型 2 1 创建具有一对多关联关系的域模型创建具有一对多关联关系的域模型 通过通过API级联操纵具有关联关系的域对象级联操纵具有关联关系的域对象 4 3 映射一对多关联关系映射一对多关联关系 5 映射一对多双向自身关联关系映射一对多双向自身关联关系 多对多关联多对多关联 6 7 关于关于unsaved-value 多对多关联多对多关联 8 1.创建具有一对多关联关系的域模型创建具有一对多关联关系的域模型 vCustomer和Order的

2、一对多双向关联 1.创建具有一对多关联关系的域模型创建具有一对多关联关系的域模型 v在Customer类中关联Order类 public class Customer implements Serializable . private Set orders=new HashSet(); public Set getOrders() return orders; public void setOrders(Set orders) this.orders=orders; 1.创建具有一对多关联关系的域模型创建具有一对多关联关系的域模型 v在Order类中关联Customer类 public cla

3、ss Order implements Serializable . private Customer customer; public Customer getCustomer() return customer; public void setCustomer(Customer customer) this.customer=customer; 2.创建具有一对多参照关系的关系模型创建具有一对多参照关系的关系模型 vORDERS表参照CUSTOMERS表 2.创建具有一对多参照关系的关系模型创建具有一对多参照关系的关系模型 v 数据库Schema create table CUSTOMER

4、S ( ID bigint not null , NAME varchar(15), primary key (ID) ); create table ORDERS ( ID bigint not null , ORDER_NUMBER varchar(15), CUSTOMER_ID bigint not null, primary key (ID) ); alter table ORDERS add constraint FK_CUSTOMER_ID foreign key (CUSTOMER_ID) references CUSTOMERS (ID); 3.映射一对多关联关系映射一对多关

5、联关系 v 映射Order类:Order.hbm.xml Order类的类的orderNumber属性为值类属性为值类 型,而型,而customer属性为实体类型,实属性为实体类型,实 体类型具有单独的体类型具有单独的OID。 3.映射一对多关联关系映射一对多关联关系 v元素的属性 name:设定待映射的持久化类的属性名,此处为 Order类的customer属性。 column: 设定和持久化类的属性对应的表的外键,此 处为ORDERS表的外键CUSTOMER_ID。 class:设定持久化类的属性的类型,此处设定 customer属性为Customer类型。 3.映射一对多关联关系映射一对

6、多关联关系 v 映射Customer类:Customer.hbm.xml 3.映射一对多关联关系映射一对多关联关系 v元素的属性 元素包括以下属性: name: 设定待映射的持久化类的属性名,这里为 Customer类的orders属性 cascade: 当取值为“save-update”,表示级联保存和更 新。 inverse:当取值为“true”,表示在双向关联中,这一端为 镜像端。 元素还包含两个子元素:和, 元素设定所关联的持久化类,此处为 Order类,元素设定与所关联的持久化类对应的 表的外键,此处为ORDERS表的CUSTOMER_ID字段。 3.映射一对多关联关系映射一对多关联

7、关系 vcascade属性的取值属性的取值 4.通过通过API级联操纵具有关联关系的域象级联操纵具有关联关系的域象 v级联级联保存Customer和Order对象 tx = session.beginTransaction(); Customer customer=new Customer(Tom,new HashSet(); Order order=new Order(); order.setOrderNumber(Tom_Order001); /建立双向关联关系 order.setCustomer(customer); customer.getOrders().add(order); se

8、ssion.save(customer); mit(); 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 v映射映射Category一对多双向自身关联关系一对多双向自身关联关系 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 vCategory类的类框图类的类框图 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 v Category类的源程序 public class Category implements Serializable private Category parentCategory; private Set childCategories=new H

9、ashSet(); public Category getParentCategory() return parentCategory; public void setParentCategory(Category parentCategory) this.parentCategory=parentCategory; public Set getChildCategories() return childCategories; public void setChildCategories(Set childCategories) this.childCategories=childCatego

10、ries; 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 vCATEGORIES表的结构 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 v数据库Schema create table CATEGORIES ( ID bigint not null , NAME varchar(15), CATEGORY_ID bigint, primary key (ID) ); alter table CATEGORIES add constraint FK_CATEGORY_ID foreign key (CATEGORY_ID) references CATEGORIES (ID

11、); 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 v映射parentCategory属性 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 v映射childCategories属性 5.映射一对多双向自身关联关系映射一对多双向自身关联关系 v操纵Category对象 Transaction tx = session.beginTransaction(); Categroy cate1 = new Categroy(); cate1.setName(二手家用); Categroy cate2 = new Categroy(); cate2.setName(二手家居); Ca

12、tegroy cate3 = new Categroy(); cate3.setName(二手厨用); /关联 cate1.getChilds().add(cate2); cate1.getChilds().add(cate3); cate2.setParentCategroy(cate1); cate3.setParentCategroy(cate1); session.save(cate1); 6.多对多关联多对多关联 v多对多关联需要另外一张映射表用于保存多对多 映射信息,由于多对多关联的性能不佳,因此在设计 中应该避免大量使用 v采取延迟加载机制来避免无谓的性能开销 v在一个权限管理系

13、统中,一个常见的多对多的映 射关系就是Group 与Role 以Group和Role之间的映射为例: 一个Group中包含了多个Role,如某个“业务主管”拥 有“出纳”和“财务”的双重角色。 而一个Role也可以属于不同的Group。 6.多对多关联多对多关联 v TGroup.hbm.xml 6.多对多关联多对多关联 vTGroup.hbm.xml 1.这里为这里为t_group 和和t_role之间的映射表。之间的映射表。 2.映射表中对于映射表中对于t_group表记录的标识字段。表记录的标识字段。 3.映射表中对于映射表中对于t_role表记录的标识字段。表记录的标识字段。 6.多对

14、多关联多对多关联 vTGroup类: public class TGroup implements Serializable private Set roles = new HashSet(); public Set getRoles() return roles; 6.多对多关联多对多关联 v TRole.hbm.xml 6.多对多关联多对多关联 vTRole类: public class TRole implements Serializable private Set groups = new HashSet(); public Set getGroups() return groups

15、; 6.多对多关联多对多关联 vmany-to-many节点中各个属性描述: 6.多对多关联多对多关联 v对TGroup 和TRole 操作: /多对多关系必须同时对关联双方进行保存 session.save(role1); session.save(role2); session.save(role3); session.save(group1); session.save(group2); session.save(group3); 7.关于关于unsaved-value v在非显示数据保存时,Hibernate将根据这个值来 判断对象是否需要保存。 v所谓显式保存,是指代码中明确调用se

16、ssion 的 save、update、saveOrupdate方法对对象进行持 久化。如: session.save(user); 7.关于关于unsaved-value v在某些情况下,如映射关系中,Hibernate 根据级 联(Cascade)关系对联接类进行保存。 v此时代码中没有针对级联对象的显示保存语句, 需要Hibernate 根据对象当前状态判断是否需要保 存到数据库。 v此时,Hibernate即将根据unsaved-value进行判 定。 7.关于关于unsaved-value v首先Hibernate会取出目标对象的id。 v之后,将此值与unsaved-value进行

17、比对,如果相 等,则认为目标对象尚未保存,否则,认为对象 已经保存,无需再进行保存操作。 7.关于关于unsaved-value v 问题: user对象是之前由hibernate从数据库中获取,同时,此user对象 的若干个关联对象address 也被加载,此时我们向user 对象新增 一address 对象,此时调用session.save(user),hibernate怎么判 断,哪些需要执行save操作,而哪些不需要? v 答: hibernate会根据unsaved-value判断user对象的数个address关联 对象; 对于我们新加入的address 对象而言,由于其id(In

18、teger 型)尚 未赋值,因此为null,与我们设定的unsaved-value(null)相同, 因此hibernate将其视为一个未保存对象,将为其生成insert语句并 执行。 8.PO和和VO vPO即 Persistence Object 纳入Hibernate管理框架中的VO vVO即 Value Object 就是一个简单的值对象, 简单携带了对象的一些属性信 息。 8.PO和和VO TUser user = new TUser(); TUser anotherUser = new TUser(); user.setName(Emma); anotherUser.setName(Kevin); /此时user和anotherUser都是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论