2006-11-29
hibernate 随记二(一对多关联查询篇)
一对多分为单向一对多和双向一对多。

从图中我们可以看到2个表之间的关系:customer 和 contact 是一对多的关系。1个customer 可能有多个contact。主控方为customer。
先来看配置文件:customer.hbm.xml
字段的映射就不说,忽略。看主要的
java 代码
- "contacts" inverse="true">
- "CUSTOMERID"/>
- class="com.zhkchi.hibernate.Contact"/>
name是指你在主控方customer class文件中建的一个set 字段的名字
key 是指被控方的外键,等会看hibernate生成的语句就清楚了 one-to-many指明了这个是一对多,class是指多的一方的类
这里,我们只是单向一对多关联,所以多方我们不需要配置什么特别的东西,只是最简单的字段映射就可以了。
下面来看代码:
java 代码
- Criteria criteria = session.createCriteria(Customer.class);
- criteria.add(Expression.eq("customerid", new Integer(101)));
- List list = criteria.list();
- if(list != null && list.size() > 0){
- for(int i = 0;i< list.size();i++){
- Customer customer = (Customer) list.get(i);
- System.out.println(customer.getCustomerid() + customer.getName());
- if(customer.getContacts() != null){
- System.out.println(customer.getContacts().size());
- }
- }
- }
hibernate生成的语句如下:
java 代码
- Hibernate: select this_.CUSTOMERID as CUSTOMERID0_0_, this_.NAME as NAME0_0_ from customer this_ whe
- re this_.CUSTOMERID=?
- 101RICKY
- Hibernate: select contacts0_.CUSTOMERID as CUSTOMERID1_, contacts0_.CONTACTID as CONTACTID1_, contac
- ts0_.CONTACTID as CONTACTID1_0_, contacts0_.ADDRESS as ADDRESS1_0_, contacts0_.CITY as CITY1_0_, con
- tacts0_.CUSTOMERID as CUSTOMERID1_0_, contacts0_.PHONE as PHONE1_0_ from contact contacts0_ where co
- ntacts0_.CUSTOMERID=?
- 2
我们从sql语句的生成中可以发现2点有用的东西:
1. 我们在输出 id 和name的时候,hibernate并没有一起把contact里面的东西一起查询出来,而是等到我们查看contact的个数才执行查询的。这个和默认的 延迟加载是吻合的。
2. 刚刚前面提到的,在主动方,set集合中,key的配置,column为多方的外键,对应着最后的 where contacts0_.customerid = ?
不过有一点我还不太明白,这里我用的是java.util.set集合,如果换成list改如何?
评论
javaman1982
2008-01-22
这样做肯定没得问题,用query.createQuery()方法做也没有问题 返回的是一个集合
但是我用findById(id)方法,返回的是一个对象,这个对象里面的“多”集合一直都为空这是怎么回事呢?
但是我用findById(id)方法,返回的是一个对象,这个对象里面的“多”集合一直都为空这是怎么回事呢?
HH
2007-03-11
发表评论
- 浏览: 13485 次
- 性别:

- 来自: 江苏

- 详细资料
搜索本博客
我的相册
100_0721
共 1 张
共 1 张
最近加入圈子
链接
最新评论
-
hibernate 随记二(一对多 ...
这样做肯定没得问题,用query.createQuery()方法做也没有问题 返 ...
-- by javaman1982 -
hibernate 随记二(一对多 ...
[color=red][/color]
-- by HH -
(特殊字符)怎么处理 类 ...
谢谢各位得回答..看来偶水平还很菜
-- by zhkchi -
(特殊字符)怎么处理 类 ...
什么啊?好像没看懂lz的意思,但<c:out value="${}" es ...
-- by SteveGY -
(特殊字符)怎么处理 类 ...
好了... 不知道为什么jstl标签c不行 我直接用request.getA ...
-- by zhkchi






评论排行榜