Hibernate 一对多关联:单向(从一的一端到多的一端)
对象模型:
Person: Integer personId, String name,Set addresses
Address:Integer addressId,
关系模型:
address表
person表
Person.hbm.xml
<class name="bean.Person" table="person" catalog="addressbooksample">
<id name="personId" type="java.lang.Integer">
<column name="personId" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<set name="addresses" cascade="save-update" lazy="false">
<key column="personID"/> 和address表中的personID外键对应
<one-to-many class="Address"/> 指定集合中放的什么类
</set>
</class>
其实,set就是用于建立Person和Address关联的,只不过平常的关联都是某个类引用另外一个类的引用。Cascade 设置保存或更新person的时候,同时更新关联对象address。Lazy=”false”设置当查询person对象时,是否查询address
Address.hbm.xml
<class name="bean.Address" table="address" catalog="addressbooksample">
<id name="addressId" type="java.lang.Integer">
<column name="addressId" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
</class>
测试:
---------------------------------------存储---------------------------------------
Person person = new Person();
person.setName("王德雷");
Address address1 = new Address();
address1.setName("上海杨浦");
Address address2 = new Address();
address2.setName("河南洛阳");
/**
*只是从一的一端建立与多的一端的关联关系
*/
Set<Address> addresses = person.getAddresses();
addresses.add(address1);
addresses.add(address2);
personDao.save(person); //存储person对象,因为set中设置了cascade="save-update",会同时保存于person关联的address对象。
----------------------------------查询---------------------------------------------------
Person person=personDao.getPerson(10);
System.out.println(person.getName());
System.out.println(((Address)person.getAddresses().iterator().next()).getName()); //因设置了lazy="false",可以抓取到与person关联的address对象
因没建立从多的一端到一的一端的关联,因此address.getPerson()将报空异常
Address address=addressDao.getAddress(9);
System.out.println(address.getPerson().getName());