一、双向1-N关联
Person类代码如下:
public class Person {
private Integer id;
private String name;
private Set<Address> addresses = new HashSet<Address>();
//省略getter和setter方法
}
Address类代码如下:
public class Address implements Serializable {
private Integer id;
private String country;
private String province;
private String city;
private Person person;
//省略getter和setter方法
}
1、基于外键的双向1-N关联
Person.hbm.xml
<class name="Person" table="person" lazy="false"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name" lazy="true"/> <set name="addresses" inverse="true" cascade="all"> <key column="person_id" unique="false"/> <one-to-many class="Address"/> </set> </class>
Address.hbm.xml
<class name="Address" table="address"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="country" type="string" column="country"/> <property name="province" type="string" column="province"/> <property name="city" type="string" column="city"/> <many-to-one name="person" class="Person" column="person_id" unique="false"/> </class>
注意:
1、设置级联操作,在持久化Person对象时Hibernate将自动持久化Person关联的Address对象。
2、不让1的一端即Person端控制关联关系(即不让Hibernate在持久化Person和Address对象后调用update语句更新person_id字段)。
3、必须手动使Address对象知道它所关联的Person对象(即显示调用a1.setPerson(p1); )。
2、基于连接表的双向1-N关联
Person.hbm.xml
<class name="Person" table="person" lazy="false"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name" lazy="true"/> <set name="addresses" table="person_address" inverse="true" cascade="all"> <key column="person_id" unique="false" update="false"/> <many-to-many class="Address" column="address_id" unique="true"/> </set> </class>
Address.hbm.xml
<class name="Address" table="address"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="country" type="string" column="country"/> <property name="province" type="string" column="province"/> <property name="city" type="string" column="city"/> <join table="person_address"> <key column="address_id" unique="true"/> <many-to-one name="person" class="Person" column="person_id" unique="false"/> </join> </class>