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

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

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

l  主键关联:即让两个对象具有相同的主键值,以表明他们之间的一对一的对应关系;数据库表不会有额外的字段来维护他们之间的关系,仅通过表的主键关系来维护.一对一主键关联映射默认了级联属性,其关联对象会同时存储.所以不会抛出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"就指示hibernate从person里面的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>

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

hibernate--OneToOne的更多相关文章

  1. Hibernate One-to-One Mappings 一对一关系映射

    Hibernate One-to-One Mappings 一对一关系映射 关键:一对一关系映射和多对一关系映射非常像.仅仅是unique 属性值为 true 样例:一个员工仅仅能有一个地址. Hib ...

  2. Hibernate @OneToOne懒加载实现解决方案

    在hibernate注解(三)中,我提高过一对一(@OneToOne)懒加载失效的问题.虽然给出了解决方法,但并没有给出完整的解决方案.今天我专门针对该问题进行讨论.至于懒加载失效的原因,在之前的文章 ...

  3. 异常:org.hibernate.id.IdentifierGenerationException

    在有关联关系的数据表中保存数据时,先保存一端,再保存多端的抛出的异常(此时不管一端,还是多端的对象都没有设置id,属性,也就是要保存的两个对象的id 属性为空.) org.hibernate.id.I ...

  4. Spring相关技术记录

    @ResponseStatus(value=) Hibernate OneToOne: 使用optional=false,才能使用lazy 如果关联字段是当前表的主键,我试了不加optional=fa ...

  5. Hibernate -- A unidirectional one-to-one association on a foreign key

    at sometime we usually need to create two tables that one table relate another.Such as a husband onl ...

  6. Hibernate映射问题之OneToOne【自己整理】

    首先贴上一个MkYong的例子 stock.java package com.mkyong.stock; import javax.persistence.CascadeType; import ja ...

  7. hibernate映射文件one-to-one

    one-to-one 元素 属性: name:映射类属性的名字 class:映射的目标类 cascade:设置操作中的级联策略 可选值为 all所有操作情况均进行级联.none所有操作情况均不进行级联 ...

  8. Hibernate逍遥游记-第13章 映射实体关联关系-002用主键映射一对一(<one-to-one constrained="true">、<generator class="foreign">)

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

  9. Hibernate逍遥游记-第13章 映射实体关联关系-001用外键映射一对一(<many-to-one unique="true">、<one-to-one>)

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

  10. Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)

    hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

随机推荐

  1. Change Homepage Logo

     Open the following defination and changed them. 1. NEW_PS_LOGO (Image Type) - To change the logo.2. ...

  2. 基于zookeeper的远程方法调用(RMI)的实现

    采用zookeeper的命名服务,采用不同的目录结构存储不同模块不同服务的rmi的url,使用key来对应不同的服务.同时采用zookeeper解决了单点问题. 当有两个相同的服务注册时,因为采用的是 ...

  3. 【转】Spark 体系结构

    原文地址:http://jerryshao.me/architecture/2013/03/29/spark-overview/ 援引@JerryLead的系统架构图作为Spark整体结构的一个 bi ...

  4. SQL语句的执行顺序

    一.sql语句的执行顺序 (8)SELECT (9) DISTINCT (11) <TOP_specification> <select_list> (1) FROM < ...

  5. 5.html5中的路径表示

    路径在html中的作用主要是进行外部资源的引入,如css文件,js文件,媒体文件等. 而路径本身有分为相对路径和绝对路径.所谓相对路径,就是相对于链接页面而言的另一个页面的路径.而绝对路径,就是直接从 ...

  6. Android去除CPU占用过高时屏幕四周闪红框

    话说有些时间没有更新博客了,今天正好解决这个问题,顺便把它记录下来.. 今天遇到的情况是这样的,当CPU占用过高时,屏幕四周会出现一个红框. 闪一次两次算了,但是挺萌的(TMD)不停的闪,我的钛合金狗 ...

  7. rails bug

    variable @fontAwesomeEotPath_iefix is undefined rails generate bootstrap:install如果还有错,保证在加载主提之前impor ...

  8. [css filter]filter在界面实现滤镜效果

    最近逛当当,发现当当尾品会的首页推荐最底端的商品链接是灰色的图片,然后鼠标hover之后就会变成正常的彩色 肯定不是通过img来改变的,然后直接看了一下源码,其实是用的filter属性 _(:з」∠) ...

  9. 值类型和引用类型(C#基础知识复习)

    一.值类型和引用类型 二.值类型的赋值和相等 三.引用类型的赋值和同一

  10. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...