Hibernate映射文件之单向关联关系映射

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>



 

猜你喜欢

转载自guoying252166655.iteye.com/blog/2072136