【Hibernate】——双向关联映射

来源:互联网 发布:淘宝网店代销 编辑:程序博客网 时间:2024/05/04 08:55

    双向关联(Bidirectional associations)

    一对多(one to many) / 多对一(many to one)

   双向多对一关联 是最常见的关联关系。(这也是标准的父/子关联关系。)

<class name="Person">    <id name="id" column="personId">        <generator class="native"/>    </id>    <many-to-one name="address"         column="addressId"        not-null="true"/></class><class name="Address">    <id name="id" column="addressId">        <generator class="native"/>    </id>    <set name="people" inverse="true">        <key column="addressId"/>        <one-to-many class="Person"/>    </set></class>create table Person ( personId bigint not null primary key, addressId bigint not null )create table Address ( addressId bigint not null primary key )        

    如果你使用List(或者其他有序集合类),你需要设置外键对应的key列为not null,让Hibernate来从集合端管理关联,维护每个元素的索引(通过设置update="false" andinsert="false"来对另一端反向操作)。

<class name="Person">   <id name="id"/>   ...   <many-to-one name="address"      column="addressId"      not-null="true"      insert="false"      update="false"/></class><class name="Address">   <id name="id"/>   ...   <list name="people">      <key column="addressId" not-null="true"/>      <list-index column="peopleIdx"/>      <one-to-many class="Person"/>   </list></class>

     假若集合映射的<key>元素对应的底层外键字段是NOT NULL的,那么为这一key元素定义not-null="true"是很重要的。不要仅仅为可能的嵌套<column>元素定义not-null="true"<key>元素也是需要的。

    一对一(one to one)

    基于外键关联的双向一对一关联也很常见。

<class name="Person">    <id name="id" column="personId">        <generator class="native"/>    </id>    <many-to-one name="address"         column="addressId"         unique="true"        not-null="true"/></class><class name="Address">    <id name="id" column="addressId">        <generator class="native"/>    </id>   <one-to-one name="person"         property-ref="address"/></class>create table Person ( personId bigint not null primary key, addressId bigint not null unique )create table Address ( addressId bigint not null primary key )        
    基于主键关联的一对一关联需要使用特定的id生成器。

<class name="Person">    <id name="id" column="personId">        <generator class="native"/>    </id>    <one-to-one name="address"/></class><class name="Address">    <id name="id" column="personId">        <generator class="foreign">            <param name="property">person</param>        </generator>    </id>    <one-to-one name="person"         constrained="true"/></class>create table Person ( personId bigint not null primary key )create table Address ( personId bigint not null primary key )        


1 0
原创粉丝点击