一对多关联映射(单向)
1、People.hbm.xml
<! DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
< hibernate-mapping default-lazy="false" >
< class name ="com.persistent.People" table ="people" >
< id name ="id" column ="peopleId" unsaved-value ="0" >
< generator class ="increment" >
</ generator >
</ id >
< property name ="name" column ="name" ></ property >
< set name ="addresses" >
< key column ="peopleId" not-null ="true" />
< one-to-many class ="com.persistent.Address" />
</ set >
</ class >
</ hibernate-mapping >
2、address.hbm.xml
<! DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
< hibernate-mapping >
< class name ="com.persistent.Address" table ="address" >
< id name ="id" column ="addressId" unsaved-value ="0" >
< generator class ="increment" >
</ generator >
</ id >
< property name ="peopleId" column ="peopleId"
insert ="false" update ="false" >
</ property >
< property name ="addressName" column ="addressName" ></ property >
</ class >
</ hibernate-mapping >
3、测试程序
session.beginTransaction();
List result = session.createQuery( " from People " ).list();
session.getTransaction().commit();
for ( int i = 0 ; i < result.size(); i ++ ) {
People people = (People)result.get(i);
System.out.println(people.getId()+" "+people.getName());
Set addresses = people.getAddresses();
for(Iterator it = addresses.iterator(); it.hasNext();){
Address address = (Address)it.next();
System.out.println(address.getId()+" "
+address.getPeopleId()+" "
+address.getAddressName());
}
}
如果加了阴影部分,则运行结果为:
Hibernate: select people0_.peopleId as peopleId0_, people0_.name as name0_ from people people0_
Hibernate: select addresses0_.peopleId as peopleId1_, addresses0_.addressId as addressId1_, addresses0_.addressId as addressId1_0_, addresses0_.peopleId as peopleId1_0_, addresses0_.addressName as addressN3_1_0_ from address addresses0_ where addresses0_.peopleId=?
Hibernate: select addresses0_.peopleId as peopleId1_, addresses0_.addressId as addressId1_, addresses0_.addressId as addressId1_0_, addresses0_.peopleId as peopleId1_0_, addresses0_.addressName as addressN3_1_0_ from address addresses0_ where addresses0_.peopleId=?
1 lucy
2 1 Hubei Wuhan
1 1 Hunan Shaoyang
2 lily
如果不加阴影部分,则运行结果为
Hibernate: select people0_.peopleId as peopleId0_, people0_.name as name0_ from people people0_
1 lucy
Hibernate: select addresses0_.peopleId as peopleId1_, addresses0_.addressId as addressId1_, addresses0_.addressId as addressId1_0_, addresses0_.peopleId as peopleId1_0_, addresses0_.addressName as addressN3_1_0_ from address addresses0_ where addresses0_.peopleId=?
1 1 Hunan Shaoyang
2 1 Hubei Wuhan
2 lily
Hibernate: select addresses0_.peopleId as peopleId1_, addresses0_.addressId as addressId1_, addresses0_.addressId as addressId1_0_, addresses0_.peopleId as peopleId1_0_, addresses0_.addressName as addressN3_1_0_ from address addresses0_ where addresses0_.peopleId=?
默认default-lazy为true,只有当程序中访问到People的Addresses时才会从数据库中加载。设置为false后,程序在加载People时立即就把它关联的Addresses全部加载进来。
另外,只有在People端设置才有效。