ORM:一对一

来源:互联网 发布:egd网络黄金交易平台 编辑:程序博客网 时间:2024/04/28 08:53

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

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

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

<id name="id" >

        <generator class="native"/>

</id>

<property name=”name”/>

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

</class>

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

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

@OneToOne

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



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

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

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

    <id name="id" >

        <generator class="native"/>

</id>

<property name=”name”/>

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

</class>

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

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

   <id name="id" >

        <generator class="native"/>

</id>

<property name=”cardNo”/>

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

</class>

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


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

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

关系模型

Husband(id,name,wife)

Wife(id,name,husband)

在Husband一端的wife属性上注解

@OneToOne

//@JoinColumn

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

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

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

生成的wife表格不会有husband字段.

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


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

对象模型

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

        }

    )

6、组件映射

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

数据库表:是一张表

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

       <id name="id">

           <generator class="native"/>    

</id>

       <property name="name"></property>

       <component name="wife">

           <property name="wifeName"/>       

<property name="wifeAge"/>

       </component>

 </class>


0 0
原创粉丝点击