Hibernate 一对一 关联关系映射

首先讲一下概念:

  • 关联关系指:实体之间的关系,即在对象模型中就是一个或多个引用;
  • 关联映射指:指将关联关系映射到数据库中,即实体到数据库表的映射,通过<class>标签映射

实体设计原则:

  • 实现无参的默认的构造函数
  • 提供一个标识
  • 建议不要使用final修饰实体类(因为要往数据库中添加数据,很可能要改变值,如果用final修饰,就无法改变了)
  • 建议为实体类生成getter和setter方法

注意:实体类的名称或实体类中的属性的名称和数据库关键字重复时,会出现问题,可用table属性和column属性进行重新命名


有两种策略可实现一对一的关联映射,分别为主键关联和唯一外键关联

主键关联

主键关联:即让两个对象具有相同主键值,以表明它们之间的一 一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联

单向关联

<class name="com.bjpowernode.hibernate.Person" table="t_person">
    <id name="id">
        <generator class="foreign">
            <param name="property">idCard</param>
        </generator>
    </id>       
    <one-to-one name="idCard" constrained="true" />
</class>

对端

    <class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
        <id name="id">
            <generator class="native" />
        </id>       
        <property name="cardNo" />
    </class>
  • class设置为foreign表明主键采用的是使用另外一个相关联的对象(根据idCard的类型找到另一张表,从而找到对端的主键)的主键作为该对象主键
  • one-to-one指示hibernate加载关联对象的方式,不会生成多余的字段,即在t_person表中不会有idCard字段
  • constrained=”true”表明当前主键是其关联对象的主键,即形成了外键约束条件
  • Person实体类中有字段id,name,idCard;IdCard实体类中有字段id,cardNo

双向关联


<class name="com.bjpowernode.hibernate.Person" table="t_person""/>
    <id name="id">
        <generator class="foreign">
            <param name="property">idCard</param>
        </generator>
    </id>       
    <one-to-one name="idCard" constrained="true" />
</class>

对端

即多添加了一个one-to-one标签

    <class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
        <id name="id">
            <generator class="native" />
        </id>       
        <property name="cardNo" />
        <one-to-one name="person" />
    </class>

Person实体类中有字段id,name,idCard;IdCard实体类中有字段id,cardNo,person(多了一个person)
注:
1>one-to-one不会生成多余的字段;
2>因为一段的主键是从对端获取的,所以在保存维护关系的一端时,会自动保存对象,不用手动保存

最后映射的表是这样的:


唯一外键关联

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

单向关联

利用many-to-one,只是设置外键字段唯一unique=”true”

    <class name="com.bjpowernode.hibernate.Person" table="t_person">
        <id name="id">
            <generator class="native" />            
        </id>       
        <property name="name" />
        <many-to-one name="idCard" unique="true" />
    </class>

对端

    <class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
        <id name="id">
            <generator class="native" />
        </id>       
        <property name="cardNo" />
    </class>

双向关联

    <class name="com.bjpowernode.hibernate.Person" table="t_person">
        <id name="id">
            <generator class="native" />            
        </id>       
        <property name="name" />
        <many-to-one name="idCard" unique="true" />
    </class>

对端

多添加了一个one-to-one标签, property-ref=”idCard”表明被关联字段为idCard,被关联实体主键作为关联字段

    <class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
        <id name="id">
            <generator class="native" />
        </id>       
        <property name="cardNo" />
        <one-to-one name="person" property-ref="idCard"></one-to-one>
    </class>

Person实体类中有字段id,name,idCard;IdCard实体类中有字段id,cardNo
注:
1>many-to-one会生成多余的字段;
2>实体类之间映射时,一段是持有另一端的对象,而普通的实体关联是加一个string或int等的属性即可

最后映射的表是这样的:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值