Person类代码如下:
具体参见各类映射关系
Address类代码如下:
public class Address implements Serializable {
private Integer id;
private String country;
private String province;
private String city;
//省略setter和getter方法
}
1、单向N-1关联
Person类代码如下:
public class Person {
private Integer id;
private String name;
private Address address;
//省略setter和getter方法
}
1)、基于外键的单向N-1关联
系统会在N的一端即Person端映射的数据表中添加一个外键列,用来参照Address表的主键列。
多个Person对应一个Address,即一个Address对应多个Person,因此无法通过在Address表中添加一个外键列来表示关联关系;
但是一个Person只能对应一个Address,因此可以在Person表中添加一个外键列来表示关联关系。
因为可以有多个Person对应一个Address,所以Person表的外键字段可以出现重复的值。
Person.hbm.xml文件内容如下:
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="identity" /> </id> <property name="name" type="string" column="name"/> <many-to-one name="address" class="org.lgy.hibernate.pojos.Address" column="address_id" cascade="all"/> </class>
2)、基于连接表的单向N-1关联
这种关联会把关联关系保存在一张单独的表中。表中有2个外键列,一个外键列用于参照person表的主键,另一个用于参照address表的主键列。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="identity" /> </id> <property name="name" type="string" column="name"/> <join table="person_address"> <!-- 映射参照本表(person表)主键的外键列,同时作为person_address表的主键 --> <key column="person_id"/> <!-- 映射参照address表主键的外键列 --> <many-to-one name="address" class="org.lgy.hibernate.pojos.Address" column="address_id" cascade="all"/> </join> </class>
2、单向1-1关联
1)、基于外键的单向1-1关联
只需为基于外键的单向N-1关联的<many-to-one/>元素增加unique=true属性即可,即为address_id字段添加唯一性约束。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="identity" /> </id> <property name="name" type="string" column="name"/> <many-to-one name="address" class="org.lgy.hibernate.pojos.Address" column="address_id" cascade="all" unique="true"/> </class>
2)、基于连接表的单向1-1关联
只需为基于连接表的单向N-1关联的<many-to-one/>元素增加unique=true属性即可,即为address_id字段添加唯一性约束。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="identity" /> </id> <property name="name" type="string" column="name"/> <join table="person_address"> <key column="person_id"/> <many-to-one name="address" class="org.lgy.hibernate.pojos.Address" column="address_id" cascade="all" unique="true"/> </join> </class>
3)、基于主键的单向1-1关联
在Person类中配置基于主键的单向1-1关联时,Person类不能拥有自己的主键生成策略,它的主键由Address类的主键决定。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="int" column="id"> <generator class="foreign"> <param name="property">address</param> </generator> </id> <property name="name" type="string" column="name"/> <one-to-one name="address" class="org.lgy.hibernate.pojos.Address" cascade="all"/> </class>
3、单向1-N关联
public class Person { private Integer id; private String name; private Set<Address> addresses; //省略setter和getter方法 }
1)、基于外键的单向1-N关联
系统会在N的一端即Address端映射的数据表中增加一个外键列,来参照person表的主键。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name"/> <set name="addresses" cascade="all"> <key column="person_id"/> <one-to-many class="org.lgy.hibernate.pojos.Address"/> </set> </class>
2)、基于连接表的1-N关联
在连接表中又2个字段,一个是person_id,参照person表的主键列;一个是address_id,参照address表的主键列。
一个Person对应多个Address,但是一个Address只能对应一个Person,所以连接表的person_id字段可以有重复值,而address_id字段的值是唯一的。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name"/> <set name="addresses" table="person_address" cascade="all"> <key column="person_id"/> <many-to-many column="address_id" class="org.lgy.hibernate.pojos.Address" unique="true"/> </set> </class>
4、单向N-N关联
单向N-N关联只能使用连接表。
只需把基于连接表的单向1-N关联的<many-to-many/>元素的unique="true"属性删除即可。
<class name="org.lgy.hibernate.pojos.Person" table="person"> <id name="id" type="int" column="id"> <generator class="identity"/> </id> <property name="name" type="string" column="name"/> <set name="addresses" table="person_address" cascade="all"> <key column="person_id"/> <many-to-many column="address_id" class="org.lgy.hibernate.pojos.Address"/> </set> </class>