Hibernate一对一映射配置详解

一对一关联分为主键关联与外键关联。

主键关联:不必加额外的字段,只是主表和辅表的主键相关联,即这两个主键的值是一样的。

外键关联:辅表有一个额外的字段和主表相关联,或者两个表都有额外的字段与对应表的相关联。

一、xml文件配置

    官方文档解释

<one-to-one

        name="propertyName"                                (1)

        class="ClassName"                                       (2)

        cascade="cascade_style"                                (3)

        constrained="true|false"                              (4)

        fetch="join|select"                               (5)

        property-ref="propertyNameFromAssociatedClass"         (6)

        access="field|property|ClassName"                       (7)

        formula="any SQL expression"                           (8)

        lazy="proxy|no-proxy|false"                         (9)

        entity-name="EntityName"                         (10)

        node="element-name|@attribute-name|element/@attribute|."

 

        embed-xml="true|false"

        foreign-key="foreign_key_name"

/>

    (1) name: 属性的名字。

(2) class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。

    (3) cascade(级联) (可选):表明操作是否从父对象级联到被关联的对象。

(4) constrained(约束) (可选):表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响save()delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用).

    (5) fetch (可选 - 默认设置为选择): 在外连接抓取或者序列选择抓取选择其一.

    (6) property-ref (可选):指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。

    (7) access (可选 - 默认是 property): Hibernate用来访问属性的策略。

    (8) formula (可选):绝大多数一对一的关联都指向其实体的主键。在一些少见的情况中, 你可能会指向其他的一个或多个字段,或者是一个表达式,这些情况下,你可以用一个SQL公式来表示。 (可以在org.hibernate.test.onetooneformula找到例子)

    (9) lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此关联总是被预先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取!

(10) entity-name (可选): 被关联的类的实体名。


 

 

1. 主键关联

唯一外键关联:

: UserAccount,一个用户对应一个账户。

配置文件都用one-to-one,在辅表的one-to-one的属性里要加constrained="true"表示受到约束。所以,将辅表的id改成foreign然后加上属性参数等。

User

 

Account

 

    User类与配置文件

    private Integer id;

   private String username;

   private String password;

   private Account account;

    one-to-one中的class属性可以不写,默认Hibernate会使用反正自己去寻找。

<one-to-one name="account" class="piaohan.domain.Account"cascade="all" />

    Account类与配置

   private Integer id;

   private String accountNum;

   private Integer money;

   private User user;

   

      <id name="id" column="id">

         <generator class="foreign">

            <param name="property">user</param>

         </generator>

      </id>

      <one-to-one name="user" constrained="true"

         class="piaohan.domain.User">

      </one-to-one>

    constrained="true"表示这个属性(name="user")对应类型的表(user表),对我现在的表(account表)形成了外键约束,user表的主键对account表的主键形成了外键约束。

该种方式如果删除想删除user对象中的account对象,不能直接删除account,需要先删除双方关系,如user.setAccount(null);或者在account方加上cascade


 

 

2. 单方外键关联

: UserAccount,一个用户对应一个账户。

User

 

Account

 

这种关联Account是用many-to-one然后用unique="true"做限制,限制成一对一的关系。所以,一对一的外键关联其实就是多对一关联的一种特例。

User类与配置

   private Integer id;

   private String username;

   private String password;

   private Account account;

 

   <one-to-one name="account" class="piaohan.domain.Account"

cascade="all" property-ref="user" />

property-ref="user" 表示关联类的属性名,即对应类的保存本类的属性名,该例在User中,表示对应类Account中,保存User属性的属性名,即user

    Account类与配置

   private Integer id;

   private String accountNum;

   private Integer money;

   private User user;

 

<many-to-one name="user" unique="true" column="userid" />


 

 

3. 双方外键关联

如果关联双方都是外键关联,那可以两边都用many-to-one

    User配置(类不变)

   

   <many-to-one name="account" cascade="all" unique="true"

         column="accountid" />

    Account配置(类不变)

 

<many-to-one name="user" unique="true" column="userid"

         cascade="all" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值