• hibernate--OneToOne



    一对一(one to one) 单向关联映射

    两个对象是一对一的的关系.

    有两种策略可以实现一对一的关联映射

    主键关联:即让两个对象具有相同的主键值,以表明他们之间的一对一的对应关系;数据库表不会有额外的字段来维护他们之间的关系,仅通过表的主键关系来维护.一对一主键关联映射默认了级联属性,其关联对象会同时存储.所以不会抛出TransientObjectException异常.

    唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以表示一对一的关联关系. unique="true".

    单向和双向的区别:

    单向关联,如Person-person_id;加载person信息时能关联对应的person_id信息

    双向关系,加载任何一方,都能关联出别一方的信息.

    注意id的主键生成策略,foreign使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。

    类Person(id,name,idCard),

    类IdCard(id,cardNo)

    一对一(单向)基于主键关联映射(了解)

    XML配置方法

    一对一单向主键关联通常使用一个特定的id生成器。

    <class name="Person" table=”t_person”>

        <idname="id" >

            <generator class="foreign">

                <paramname="property">idCard</param>

           </generator>

        </id>

        <one-to-one name="idCard" constrained="true"/>

    </class>

    one-to-one不会加载字段,它告诉HIBERNATE怎样加载其引用对象.如何加载呢,默认根据主键加载其引用对象.如在t_person中查到id=2,自动加载t_idCard中id=2的对象信息. constrained="true",表明person主键是个外键,表示当前主键上存在着idCard约束,当前主键id作为外键,参照了idCard.

    <paramname="property">idCard</param>表明person中的id来源于idCard,也就是共享idCard的主键.

    Annotation配置一对一(单向)主键关联映射.(BUG)

    @OneToOne

    @PrimaryKeyJoinColumn

    BUG,系统不会生成主键映射.推荐使用XML配置方法.

    一对一(单向)基于外键关联映射

    和单向多对一关联几乎是一样的。唯一不同的就是单向一对一关联中的外键字段具有唯一性约束。这种方法会在表中生成一个新的外键字段.如果不限制外字段的唯一性约束,就会导致产生多对一的关联. 指定多的一端unique="true",这样就限制了多的一端的多重性为一.

    <class name="Person" table=”t_person”>

        <idname="id" >

            <generatorclass="native"/>

    </id>

    <property name=”name”/>

        <many-to-one name="idCard" column="addressId" unique="true"

           not-null="true"/>

    </class>

    这种状态注意TransientObjectException异常.在保存时就先保存外键idCard,再保存Person类.

    一对一单向外键关联Annotation配置

    @OneToOne

    @JoinColumn(name="指定生成的外键字段名字")

    一对一(双向)主键关联映射(了解)

    PersonßàIdCard.在另一端也加上一个一对一的单向关联映射.

    模型对象

    Person(id,name,idCard)

    IdCard(id,cardNo,person)中,双方都持有对方的属性引用.

    一对一(双向)主键关联映射XML配置方式

    在IdCard配置中建立映射,<one-to-onename="person"/>指示Hibernate如何加载,默认情况下根据主键加载.也就是在基于单向一对一的映射中, 在另一端也加上一个单向一对一的主键关联映射.

    Person一端配置

    <class name="Person" table=”t_person”>

        <idname="id" >

            <generator class="foreign">

                <paramname="property">idCard</param>

            </generator>

        </id>

        <one-to-one name="idCard" constrained="true"/>

    </class>

    在另一端IdCard配置

    <class name=" IdCard " table=”t_idCard”>

        <idname="id" >

            <generatorclass="native"/>

    </id>

    <property name=”cardNo”/>

        <one-to-one name="person"property-ref=”idCard />

    </class>

    一对一(双向)主键关联映射Annotation(BUG)

    在两端各自的引用属性上加上

    @OneToOne

    @PrimaryKeyJoinColumn

    一对一(双向)唯一外键关联映射

    Personß----àIdCard.在另一端也加上一个一对一的单向关联映射.

    在模型对象

    Person(id,name,idCard)

    IdCard(id,cardNo,person),

    双方都持有对方的属性引用.

    需要在另一端加上<one-to-one>,指示hibernate如何加载,默认情况下根据主键加载person;因为外键关联映射中,两个实体的关系是由person的外键idCard来维护的,所以不能指定person的主键来加载person,而应根据person的外键idCard来加载person对象.

    一对一双向外键关联映射XML配置方式

    Person一端:用多对一配置外键唯一形成一对一的配置方式.

    <class name="Person" table=”t_person”>

        <id name="id" >

            <generatorclass="native"/>

    </id>

    <property name=”name”/>

        <many-to-one name="idCard" column="addressId" unique="true"/>

    </class>

    IdCard一端:一对一,引用另一端外键

    <class name=" IdCard " table=”t_idCard”>

        <idname="id" >

            <generatorclass="native"/>

    </id>

    <property name=”cardNo”/>

    <one-to-one name="person" property-ref="idCard"/>

    </class>

    要想加载idCard,如果不加property-ref,默认根据person主键id来加载,property- ref="idCard"就指示hibernateperson里面的idCard属性来加载.

    一对一双向外键关联映射Annotation配置方式

    双方互持对方的属性的引用

    关系模型

    Husband(id,name,wife)

    Wife(id,name,husband)

    在Husband一端的wife属性上注解

    @OneToOne
    @JoinColumn(name="wifeId")

    在Wife一端的husband加上注解,mappedBy

    @OneToOne(mappedBy="wife")引用属性

    加上mappedBy属性后就可以在wife这一端告知这个关联是在wife属性上设置的.就不用管理wife这一端生成的husband的设置.生成的wife表格不会有husband字段.

    规律:有双向关联时mappedBy通常必设.

    联合主键一对一单向外键关联映射

    对象模型

    Wife(id,name,age) WifePk(id,name)

    Husband(id,name,wife)

    1 在Wife中建立联合主键生成策略

      @IdClass(WifePk.Class)

      @Id

    2 在Husband中添加个外键即可

      @OneToOne

    3自定义Husband中外键的名字

        @OneToOne

    @JoinColumns(

            {

               @JoinColumn(name="wifeId", referencedColumnName="id"),

               @JoinColumn(name="wifeName",referencedColumnName="name")

            }

        )

    XML配置方式:略

    组件映射

    对象关系:一个对象是另一个对象的一部分

    数据库表:是一张表

    Annotation:@Embeddable,@Embedded

    XML:<component>

    对象模型

    Husband(id,name,wife)

    Wife(wifeName,wifeAge)

    Annotation:

    在Husband的wife属性上建立注解

    @Embedded 表明该对象是从别的位置嵌入过来的,是不需要单独映射的表.

    这种方式生成的表为husband(id,name,wifename,wifeage),不会生成wife表.

    @AttributeOverride注解可以覆盖该属性对应的嵌入式对象的列映射:

    XML:

    <class name="Husband" >

           <idname="id">

               <generatorclass="native"/>    

    </id>

           <propertyname="name"></property>

           <componentname="wife">

               <propertyname="wifeName"/>       

    <property name="wifeAge"/>

           </component>

     </class>

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    today lazy . tomorrow die .
  • 相关阅读:
    git track
    npm 升级到最新版本
    三行代码实现垂直居中和cube
    布局之定位
    MongoDB的安装问题
    正则表达式
    javascript表单验证
    Oracle中创建表,行级触发器,序列
    查找某个字符在字符串中出现的次数
    oracle表中有一列id她是自动增长的,插入一条数据时怎么取得id的值
  • 原文地址:https://www.cnblogs.com/france/p/4808660.html
Copyright © 2020-2023  润新知