hibernate 随记二(一对多关联查询篇)

一对多分为单向一对多和双向一对多。

从图中我们可以看到2个表之间的关系:customer 和 contact 是一对多的关系。1个customer 可能有多个contact。主控方为customer。

先来看配置文件:customer.hbm.xml

字段的映射就不说,忽略。看主要的

java 代码
  1. "contacts" inverse="true">   
  2.     "CUSTOMERID"/>   
  3.     class="com.zhkchi.hibernate.Contact"/>   
  4.   

name是指你在主控方customer class文件中建的一个set 字段的名字

key 是指被控方的外键,等会看hibernate生成的语句就清楚了 one-to-many指明了这个是一对多,class是指多的一方的类

这里,我们只是单向一对多关联,所以多方我们不需要配置什么特别的东西,只是最简单的字段映射就可以了。

下面来看代码:

java 代码
  1. Criteria criteria = session.createCriteria(Customer.class);   
  2. criteria.add(Expression.eq("customerid"new Integer(101)));   
  3. List list = criteria.list();   
  4.     if(list != null && list.size() > 0){   
  5.         for(int i = 0;i< list.size();i++){   
  6.             Customer customer = (Customer) list.get(i);   
  7.             System.out.println(customer.getCustomerid() + customer.getName());   
  8.             if(customer.getContacts() != null){   
  9.                 System.out.println(customer.getContacts().size());   
  10.             }   
  11.         }   
  12.     }  

 

hibernate生成的语句如下:

java 代码
  1. Hibernate: select this_.CUSTOMERID as CUSTOMERID0_0_, this_.NAME as NAME0_0_ from customer this_ whe   
  2. re this_.CUSTOMERID=?   
  3. 101RICKY   
  4. Hibernate: select contacts0_.CUSTOMERID as CUSTOMERID1_, contacts0_.CONTACTID as CONTACTID1_, contac   
  5. ts0_.CONTACTID as CONTACTID1_0_, contacts0_.ADDRESS as ADDRESS1_0_, contacts0_.CITY as CITY1_0_, con   
  6. tacts0_.CUSTOMERID as CUSTOMERID1_0_, contacts0_.PHONE as PHONE1_0_ from contact contacts0_ where co   
  7. ntacts0_.CUSTOMERID=?   
  8. 2  

我们从sql语句的生成中可以发现2点有用的东西:

1. 我们在输出 id 和name的时候,hibernate并没有一起把contact里面的东西一起查询出来,而是等到我们查看contact的个数才执行查询的。这个和默认的 延迟加载是吻合的。

2. 刚刚前面提到的,在主动方,set集合中,key的配置,column为多方的外键,对应着最后的 where contacts0_.customerid = ?

不过有一点我还不太明白,这里我用的是java.util.set集合,如果换成list改如何?

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值