hibernate关系映射

Posted 小姜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate关系映射相关的知识,希望对你有一定的参考价值。

对象之间的关系

1  这里的关系映射指的是对象之间的关系,并不是指数据库的关系,本章解决的问题是当对象之间处于

下列关系之一时,数据库表该如何映射,编程上该如何对待(红色为重点)

2 简化问题:

  a) 怎么写 Annotation

  b)增删改査CRUD怎么写

3 —对一

  a)单向(主键、外键)

  b)双向(主键、外键)

  c)中间表

4—对多

  a)一张主表,多张子表

5 组件映射

  a)@Embeddable

  b)@ Embedded

一对一关联

1 一对一单向外键关联

  a)项目名称:hibernate_0600_one2one_uni_fk

  b)Annotation: 在被约束表字段的get方法上加@0ne20ne @JoinColumn

       @OneToOne

        @JoinColumn(name="wifeid") //指定生成的数据库字段名

        public Wife getWife() {

               return wife;

        }

  c)xml: 在被约束表的xml配置文件中加<many-to-one unique

      <class name="com.bjsxt.pojo.StuIdCard">

         <id name="id">

             <generator class="native"></generator>

         </id>

         <property name="num"/>

         <many-to-one name="student" column="studentId" unique="true">

    </many-to-one>

  </class>

unique="true"是保证生成的字段唯一,这样<many-to-one 也达到了一对一的效果

2 一对一双向外键关联

  a)项目名称:hibernate_0700_one2one_bi_fk^

  b)Annotation: @0ne20ne(mappedBy=”…”)

    规律:凡是双向关联,必设mappedBy

    在Wife类中 写Husband对象属性 并添加注解@OneToOne(mappedBy="wife") mappedBy作用是指定这个一对一关联是被Husband类的 wife属性(准确说是getWife方法)做的映射

@OneToOne(mappedBy="wife")

           public Husband getHusband() {

              return husband;

       }

       在类中写Wife对象属性

        @OneToOne

        @JoinColumn(name="wifeid") //指定生成的数据库字段名

        public Wife getWife() {

               return wife;

        }

       此注释将由Husband表中生成wifeid字段作为fk外键,wife表中不生成额外的Husbandid字段

  c)xml: many-to-one unique <one-to-one property-ref

在Student类中写StuIdCard属性, StuIdCard类中写Student属性

StuIdCard.hbm.xml文件中加

<many-to-one name="student" column="studentId" unique="true"></many-to-one>

Student.hbm.xml文件中加

<one-to-one name="stuIdCard" property-ref="student"></one-to-one>

其中, property-ref 相当于mappedBy

此方式生成的StuIdCard表中包含studentid字段作为fk外键, Student表中不生成额外的字段

特别说明: 一对一单向外键关联与一对一双向外键关联在数据库的表的格式是一样的,区别在于

java程序中. 双向外键关联可通过Hibernate在两个类间互相调用彼此,而单向外键关联只能单方向调用.

3 一对一单向主键关联

  a) 项目名称:hibernate_0800_one2one_uni_pk

  b)@primaryKeyJoinColumn

  c)xml: <one-to-one id 使用 foreign class

4 一对一双向主键关联(不重要)

  a)项目名称:hibernate_0900_one2one_bi_pk

  b)@primaryKeyJoinColumn

  c)xml: <one-to-one id 使用foreign class和<one-to-one property-ref

5联合主键

  a)项目名称:hibernate_1000_one2one_uni_fk_composite

  b)@JoinColumns

Wife类中建立联合主键,建立方式参考 ID生成策略中的联合主键部分

Husband类中写Wife对象属性,并在其get方法上写@OneToOne即可完成一对一外键映射

若想要指定生成的外键名 则需使用@JoinColumns注解,如下:

       @OneToOne

         @JoinColumns( { @JoinColumn(name = "wifeid", referencedColumnName = "id"),

                            @JoinColumn(name = "wifename", referencedColumnName = "name") })

         /*@JoinColumns用于在一对一外键关联存在联合主键情况时指定生成的外键字段名称

         @JoinColumns的参数为@JoinColumn数组 @JoinColumn内除需指定name属性外还需指定

         referencedColumnName属性值 作用是可指定生成的字段名所对应的目标表字段名*/

         public Wife getWife() {……}

以上是关于hibernate关系映射的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate框架学习之注解配置关系映射

Hibernate - 超越对象/关系映射?

Hibernate 对象关系映射文件

Hibernate关联关系映射

Hibernate (开源对象关系映射框架)

Hibernate学习8—Hibernate 映射关系