Hibernate学习随笔-----关系映射(1)单向N-1关联

来源:互联网 发布:易语言股票源码 编辑:程序博客网 时间:2024/05/16 09:11

单向N-1关联:只需要从N的一端可以访问1的一端

单向N-1的关系,如多个人对应同一个住址,只需从人的实体端可以找到对应的地址实体,无需关心某个地址的全部住户。

程序应该在N的一端的持久化类中增加一个属性,该属性引用的是1的一端的关联实体。

public class Person{

    private Address address;   //每个Person都单向的持有一个Address

    public void setAddress(Address address){ this.address=address;}

    public Address getAddress(){return this.address;}

}

pulic class Address{}  //程序无需从Address访问Person,所以Address无需增加Person属性


1.无连接表的N-1关联

Person端增加了Address属性,该属性不是一个普通的组件属性,而是引用另一个持久化类的类,Hibernate使用<many-to-one>元素映射N-1的关联实体,直接采用<many-to-one>元素来映射关联实体将会在N的一端的数据表中增加一个外键列,用于参照主表记录。

注:直接使用<mang-to-one>元素来映射N-1关联时,Hibernate将无需使用连接表,直接使用外键关联策略来处理这种关联映射。

Person.hbm.xml

<class name="Person" table="person_inf">

  <!--用映射N-1关联实体,指定关联实体类为Address,指定外键列名为address_id,并指定级联全部操作-->

  <many-to-one name="address" cascade="all" class="Address" column="address_id"/>

</class>

注:在所有基于外键约束的关联关系中,都必须牢记:要么总是先持久化主表记录对应的实体,要么设置级联操作;否则当Hibernate试图插入从表记录时,如果发现该从表记录参照的主表记录不存在,那一定会抛出异常。

2.有连接表的N-1关联:使用于在底层数据库建模时使用连接表来建立外键关系映射的关联关系

如果需要使用连接表来映射单向N-1关联,则需要显示使用<join/>元素,该元素用于强制将一个类的属性映射到多张表中。使用<join/>元素时通常需要指定一个table属性,用于指定连接表的表名。

使用<join/>元素映射连接表时还需要外键关联,应在配置文件中增加<key/>子元素来映射外键,并为join元素增加<many-to-one>子元素,用于映射N-1的关联实体。

<class name="Person" table="person_inf">

    <join table="person_address">

         <key column="person_id/">

         <many-to-one name="address" cascade="all" class="Address" column="address_id"/>

    </join>

</class>

0 0