Hibernate关联配置(XML)

本文深入探讨了数据库中一对一、一对多、多对一、多对多等关联关系的实现方式,包括基于外键和主键关联的方法,以及使用连接表进行双向关联的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(many to one)

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>

</class>

create table Person ( personId bigint not null primary key, addressId bigint not null )

create table Address ( addressId bigint not null primary key

8.2.2一(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>

</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>

</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 )

8.2.3多(one to many

基于外键关联向一关联是一很少的情况,并不推荐使用。

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <set name="addresses">

        <key column="personId" not-null="true"/>

        <one-to-many class="Address"/></set>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

</class>

create table Person ( personId bigint not null primary key )

create table Address ( addressId bigint not null primary key, personId bigint not null )

们认为对这种关联关系最好使用接表。

8.3. 使用接表的关联Unidirectional associations with join tables

8.3.1(one to many)

基于接表的向一关联 应该优先被采用。注意,通指定unique="true",我可以把多性从多多改变为多。

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <set name="addresses" table="PersonAddress">

        <key column="personId"/>

        <many-to-many column="addressId" unique="true" class="Address"/></set>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId not null, addressId bigint not null primary key )

create table Address ( addressId bigint not null primary key )

8.3.2一(many to one

基于接表的向多关联关联关系可的情况下用也很普遍。

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <join table="PersonAddress" optional="true">

        <key column="personId" unique="true"/>

        <many-to-one name="address" column="addressId" not-null="true"/></join>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId bigint not null primary key, addressId bigint not null )

create table Address ( addressId bigint not null primary key )

8.3.3一(one to one

基于接表的向一关联非常少,但也是可行的。

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <join table="PersonAddress" optional="true">

        <key column="personId" unique="true"/>

        <many-to-one name="address" column="addressId" not-null="true" unique="true"/>

    </join>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )

create table Address ( addressId bigint not null primary key )

8.3.4多(many to many

最后, 向多关联.

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <set name="addresses" table="PersonAddress">

        <key column="personId"/>

        <many-to-many column="addressId" class="Address"/>

    </set>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )

create table Address ( addressId bigint not null primary key )

8.4. 双向关联Bidirectional associations

8.4.1多(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 )

8.4.2一(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 )

8.5. 使用接表的双向关联Bidirectional associations with join tables

8.5.1多(one to many /一( many to one

基于接表的双向一关联。注意inverse="true"可以出关联的任意一端,即collection端或者join端。

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <set name="addresses" table="PersonAddress">

        <key column="personId"/>

        <many-to-many column="addressId" unique="true" class="Address"/></set>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

    <join table="PersonAddress" inverse="true" optional="true">

        <key column="addressId"/>

        <many-to-one name="person" column="personId" not-null="true"/></join>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId bigint not null, addressId bigint not null primary key )

create table Address ( addressId bigint not null primary key )

8.5.2一(one to one

基于接表的双向一关联,但也是可行的。

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <join table="PersonAddress" optional="true">

        <key column="personId" unique="true"/>

        <many-to-one name="address" column="addressId" not-null="true" unique="true"/>

</join>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

    <join table="PersonAddress" optional="true" inverse="true">

        <key column="addressId" unique="true"/>

        <many-to-one name="address" column="personId" not-null="true" unique="true"/>

    </join>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId bigint not null primary key, addressId bigint not null unique )

create table Address ( addressId bigint not null primary key )

8.5.3多(many to many

最后, 双向多关联.

<class name="Person">

    <id name="id" column="personId"><generator class="native"/></id>

    <set name="addresses">

        <key column="personId"/>

        <many-to-many column="addressId" class="Address"/></set>

</class>

<class name="Address">

    <id name="id" column="addressId"><generator class="native"/></id>

    <set name="people" inverse="true">

        <key column="addressId"/>

        <many-to-many column="personId" class="Person"/></set>

</class>

create table Person ( personId bigint not null primary key )

create table PersonAddress ( personId bigint not null, addressId bigint not null, primary key (personId, addressId) )

create table Address ( addressId bigint not null primary key )

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值