一对多关联映射(单向)
1、People.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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
<?xml version="1.0" encoding="UTF-8"?>
<!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 session = HibernateSessionFactory.getSession();
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端设置才有效。
本文介绍了Hibernate中一对多关联映射的配置方法,通过People和Address两个实体类的示例,展示了如何进行单向的一对多关联映射,并解释了lazy加载策略的影响。
5802

被折叠的 条评论
为什么被折叠?



