hibernate 多对一的双向理解

转载 2016年08月31日 08:00:06

在电子商务应用中,经常会有这样的需求:根据给定的客户,得到该客户的所有订单;根据给定的订单,得到该订单的所属客户。对于这种双向关联的情况,在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方法对  

持久化类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方法对  

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(new Integer(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所示。

  

【Hibernate步步为营】--(一对多映射)之双向关联

单向关联的一对多映射,在一的一端维护双向的关系这种做法虽然能实现但是存在很多缺陷,首先生成很多多余的SQL语句,因为多的一端不维护关系,只有一的一端维护,在进行操作时一的一端会发出多余的update语...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年05月25日 14:26
  • 4331

hibernate(四)一对多单向、多对一双向、自身双向关联

​经过前几篇文章的简略总结,主要认识了关于hibernate的基本认识,顺便认识了hibernate的简单的一个原理。具体参见 Hibernate (一)hibernate入门   H...
  • chenfanglincfl
  • chenfanglincfl
  • 2015年04月28日 01:10
  • 2784

Hibernate关联映射之一对多,多对一以及双向一对多

在上篇博客我们讲了hibernate对单表的操作,本篇博客就来讲讲对多表的关联映射操作。首先我们拿来做例子的表为班级表1---n学生表,在这次的测试主键我用的是序列,创建代码如下: --班级表 dro...
  • qq_26624661
  • qq_26624661
  • 2016年08月13日 15:17
  • 2225

hibernate一对多双向注解

多的一方@Entity @Table(name = "TEMPLET") public class Templet { @Id @SequenceGenerator(name="TEMPLET_S...
  • XueSeYaoTong
  • XueSeYaoTong
  • 2015年11月26日 16:28
  • 1005

hibernate5(11)注解映射[3]一对多多对一双向关联

在上两篇文章里,我们详细地分别讲解了一对多和多对一的单向关联配置的具体属性含义,在这一篇文章里,我们完成两者的的整合建立双向关联。 在实际的博客网站中,我们可能需要根据文章读取作者(用户)信息,但肯...
  • qwe6112071
  • qwe6112071
  • 2016年04月08日 08:51
  • 3807

Hibernate一对多双向注解配置实例

*customer和order是一对多的关系,一个用户可以有多条订单,一条订单只能从属于一个用户。 所以,customer是一的一方,order是多的一方。*package com.lejuad.l...
  • gongzhufanlulu
  • gongzhufanlulu
  • 2016年04月29日 10:17
  • 2147

Hibernate xml一对多关联映射 单向+双向

1.单向 一对多关联映射利用了多对一关联映射原理。 多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一; 一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系...
  • yyywyr
  • yyywyr
  • 2011年08月09日 11:07
  • 2761

hibernate 一对多 多对一 关系的理解

1、单向多对一和双向多对一的区别? 只需要从一方获取另一方的数据时 就使用单向关联 双方都需要获取对方数据时 就使用双向关系 部门--人员 使用人员时 如果只需要获取对应部门信息(u...
  • l55iuming
  • l55iuming
  • 2015年10月20日 20:58
  • 2735

hibernate的多对一,一对多单向关联,双向关联区别与联系

首先来看一下多对一。举个例子来说用户和组。一个组中有多个用户,一个用户只能属于一组。用户和组之间就是一个多对一的关系的。如下图        这个关系我们要怎样维护呢?我们想象一下,假如...
  • yuntaishan0102
  • yuntaishan0102
  • 2013年12月13日 09:00
  • 2652

hibernate一对多双向关联中怎么配置list

假设有一个文档管理者类User,和一个文档类Archives。其中User和Archives是一对多双向关联关系 表现在类中如下(此处省略了属性的set和get方法) public class U...
  • chunqiuwei
  • chunqiuwei
  • 2012年10月14日 10:26
  • 6797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hibernate 多对一的双向理解
举报原因:
原因补充:

(最多只允许输入30个字)