在电子商务应用中,经常会有这样的需求:根据给定的客户,得到该客户的所有订单;根据给定的订单,得到该订单的所属客户。对于这种双向关联的情况,在Hibernate应用中,也有人叫多对一双向关联,只是叫法不同而已,都是通过映射一对多双向关联关系来实现的。

不管是多对一单向关联还是(一对多)多对一双向关联,在关系型数据库中的表现方式都是一样的,均通过外键参照来实现如图4-18所示。

 
 

只是在持久化类与ORM映射文件中单向关联与双向关联存在一些区别而已,如图4-19所示。

  
 

持久化类Customer.java:

  1. package com.ORM;
  2. import java.io.Serializable;
  3. import java.util.*;
  4. public class Customer implements Serializable{
  5. private java.lang.Integer id;               //ID号
  6. private java.lang.String cname;                 //客户姓名
  7. private java.lang.String bank;              //银行账号
  8. private java.lang.String phone;                 //联系电话
  9. private Set orders = new HashSet();             //订单集合
  10. public Customer(){}
  11. //省略上述各属性的get/set方法对
  12. }

持久化类Orders.java:

  1. package com.ORM;
  2. import java.io.Serializable;
  3. public class Orders implements Serializable{
  4. private java.lang.Integer id;               //ID号
  5. private java.lang.String orderno;               //订单编号
  6. private java.lang.Double money;                 //订单金额
  7. private Customer customer;              //订单的所属客户
  8. public Orders(){}
  9. //省略上述各属性的get/set方法对
  10. }

customer表与Customer类的ORM映射文件Customer.hbm.xml:

  1. <hibernate-mapping package="com.ORM">
  2. <class name="Customer" table="customer">
  3. <id name="id" column="ID" type="integer">
  4. <generator class="identity"/>
  5. </id>
  6. <property name="cname" column="CNAME" type="string" />
  7. <property name="bank" column="BANK" type="string" />
  
 

orders表与Orders类的ORM映射文件Orders.hbm.xml:

  
 

(1)创建供测试用的TestBean.java。

  1. ……
  2. public void addCustomer(){
  3. Customer customer = new Customer();
  4. customer.setCname("张三");
  5. customer.setBank("123456789123456789");
  6. customer.setPhone("020-12345678");
  7. dao.addCustomer(customer);
  8. }
  9. public Customer loadCustomer(Integer id){
  10. return dao.loadCustomer(id);
  11. }
  12. public void addOrders(Customer customer){
  13. Orders order = new Orders();
  14. order.setOrderno(new Long(System.currentTimeMillis()).toString());
  15. order.setMoney(new Double(rnd.nextDouble()*10000));
  16. //将Customer与Orders实例进行双向关联
  17. order.setCustomer(customer);
  18. customer.getOrders().add(order);
  19. dao.addOrders(order);
  20. }
  21. public Orders loadOrders(Integer id){
  22. return dao.loadOrders(id);
  23. }
  24. ……

(2)创建测试JSP页面index.jsp。

  1. <jsp:useBean id="test" class="com.bean.TestBean" />
  2. ...........

index.jsp运行分析。

(1)执行了test.addCustomer()以后,Hibernate向数据库服务器提交的SQL语句为:

  1. 【SQL】insert into customer (CNAME, BANK, PHONE) values
  2. ("张三", "123456789123456789","020-12345678")

(2)执行了test.loadCustomer(id)以后,Hibernate向数据库服务器提交的SQL语句为:

  1. 【SQL】select * from customer where ID=1
  2. select * from orders where CUSTOMER_ID=1

由于Customer.hbm.xml中的lazy="false",在装载Customer后,会立即装载与当前Customer对象一对多关联的所有Orders对象。

(3)执行了test.addOrders(customer);以后,Hibernate向数据库服务器提交的SQL语句为:

  1. 【SQL】insert into orders(ORDERNO,MONEY,CUSTOMER_ID)
  2. values("1163858590843",7158.76,1)

(4)执行了test.loadOrders(newInteger(1));以后,Hibernate向数据库服务器提交的SQL语句为:

  1. 【SQL】select * from orders where ID=1
  2. select * from customer where ID=1

由于Orders.hbm.xml中的lazy="false",在装载Orders后,会立即装载与当前Orders对象多对一关联的Customer对象。

index.jsp运行效果如图4-20所示。

  
分享:

6

hibernate映射一对多双向关联关系实例相关推荐

  1. 06章 映射一对多双向关联关系、以及cascade、inverse属性

    当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...

  2. hibernate的一对多双向关联映射----客户和订单关系

    客户和订单关系:客户是一的一方,订单是多的一方. customer表: CREATE TABLE `customer` ( `ID` int(4) NOT NULL AUTO_INCREMENT , ...

  3. 【SSH系列】Hibernate映射 -- 一对多关联映射

         映射原理        一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...

  4. Hibernate(九)一对多双向关联映射

    上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...

  5. Hibernate的一对多关联关系(单向和双向)

    在领域模型中,类与类之间最普遍的关系就是关联关系.在 UML 中,关联是有方向的.以 Customer 和 Order 为例:一个用户能发出多个订单, 而一个订单只能属于一个客户.从 Order 到 ...

  6. Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射

    在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...

  7. hibernate的映射之二(一对多双向关联)

    hibernate的一对多双关联 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多 hihernate一对多关联映射(双向Dept<----->Emp) 一对多双 ...

  8. hibernate 的一对多关联关系映射配置

    hibernate 是操作实体类: 表是一对多的关系,当创建这2个实体的时候 在一的一方定义一个多的一方的集合 在多的一方定义一个一的一方的对象 表是多对多的关系,当创建这2个实体的时候 在互相中都有 ...

  9. (八)Hibernate的一对多关联关系

    一.概述 例如,以客户(Customer)和订单(Order)为例,一个客户能有多个订单,一个订单只能有一个客户. 从Customer到Order是一对多关联,在java类中的面向对象设计应该一个Cu ...

最新文章

  1. Squid下Http头信息优先级
  2. 180608-Git工具之Stash
  3. UEFI、BIOS、Secure Boot的关系和知识介绍
  4. 在java中将数据信息写入本地文本(1)
  5. java 变成题_Java 习题8 参考答案及解析
  6. 关于Java泛型和擦除
  7. php处理上传文件的步骤,php文件上传步骤
  8. 关于苹果Mac上设置固件密码的方法?
  9. 凸优化第五章对偶 5.5最优性条件
  10. vue 点击文字input_Vue实现点击按钮复制文本内容
  11. html 415错误,HTTP 415 错误 – 不支持的媒体类型(Unsupported media type)
  12. 华为搜索引擎Petal与Google的区别
  13. luogu P1724 东风谷早苗
  14. 记录一下blender烘焙光照漫反射贴图
  15. 计算机不能共享怎么设置,win7无法共享文件夹 共享文件设置不了共享怎么办?...
  16. c语言大作业成绩分析问题,河南科技大学c语言课程设计-综合排序设计报告-成绩分析问题.doc...
  17. HDU 2121 Ice_cream’s world II (最小树形图+虚根)
  18. python机器学习初探
  19. 数据恢复如何看异或问题
  20. 第三章-电阻式传感器

热门文章

  1. hdu4278 小想法
  2. C语言经典例16-最大公约数和最小公倍数
  3. 汇编 加法减法指令 inc dec add sub neg 标志寄存器测试
  4. 【RecyclerView】 十三、RecyclerView 数据更新 ( 移动数据 | 数据改变 )
  5. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
  6. unity游戏框架学习-框架结构
  7. 数据库为什么使用B+树而不是B树
  8. 使用nginx缓存服务器上的静态文件
  9. 网页标准HTML5标准较量正酣
  10. ORACLE 10G DATAGUARD实战步骤(转载)