一、双向1-N关联
Person.java
public class Person { private Integer id; private String name; private Integer age; private Set<Address> addresses = new HashSet<Address>(); //省略setter和getter方法 }
Address.java
public class Address implements Serializable { private Integer id; private String country; private String province; private String city; private Person person; //省略setter和getter方法 }
1、基于外键的双向1-N关联
因为关联需要基于外键,所以Hibernate必须要在一方的表中存储一个外键列,又因为1个person对应n个address、1个address对应1个person,所以在Address端(即n的一端)的表中存储外键列再合适不过了。
Person.hbm.xml
<class name="Person" table="person" lazy="true"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name" lazy="true"/> <property name="age" type="integer" column="age" lazy="true"/> <!--不让1的一端控制关联关系,级联保存瞬态的关联对象--> <set name="addresses" inverse="true" cascade="all" lazy="true"> <key column="person_id" unique="false"/> <one-to-many class="Address"/> </set> </class>
Address.hbm.xml
<class name="Address" table="address" lazy="true"> <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" lazy="proxy"/> </class>
2、基于连接表的双向1-N关联
Person.hbm.xml
<class name="Person" table="person" lazy="true"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name" lazy="true"/> <property name="age" type="integer" column="age" lazy="true"/> <set name="addresses" table="person_address" inverse="true" cascade="all" lazy="true"> <key column="person_id" unique="false"/> <many-to-many class="Address" column="address_id" unique="true"/> </set> </class>
Address.hbm.xml
<class name="Address" table="address" lazy="true"> <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>
二、双向N-N关联