一对多分为单向一对多和双向一对多。
从图中我们可以看到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改如何?