hibernate单向一对一映射

一、唯一外键

        唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示:

       上图的两个实体表,分别为人和身份证,很明显的一个人对应着一个身份证。身份证作为一个单独的实体表它添加了标识列,而且此标识列是人实体表中的外键先关联。这种在实现上类似于上篇文章中讲到的多对一映射,一个表的主键标识列是另一张表的外键,所在在实现时使用的也应该是<many-to-one>标签,但不同的是这里采用的是唯一对应,此时应该设置其它的属性来做唯一标识。
        为了实现一对一的唯一外键映射,这时就必须在<many-to-one>标签中添加上属性unique,也就是指定多的一端的unique值为true,反应到该示例中也就是在person的映射文件中设置一个<many-to-one name="idCard">标签,并且标签中需要添加unique="true",所以对应的Person.java的映射文件Person.hbm.xml的代码如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.hibernate.Person" table="PERSON">
        <id name="id" type="int">
            <generator class="native"/>
        </id>
    <property name="name"></property>
    <many-to-one name="idCard" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

       对比多对一关联映射和一对一唯一外键关联映射,其实它们两个都是使用了<many-to-one>本质上都是外键约束,只不过一对一的是唯一映射,需要添加unique="true"的属性,其它的它们两个是相同的。


二、主键关联映射

        上文讨论了一对一的唯一外键映射,它其实是多对一关联映射的一种特殊情况,并且在关联映射中会有多种情况,这里再继续讨论关联映射可能的情况。
        在一对一的关联映射中会有一种特殊的情况就是一个表的主键同时也是一个表的外键,也就是说一个字段是同是主键和外键,并且该外键唯一对应着另一张表的一行,它们两个是唯一对应的关系,反应到对象模型中它们之间属于一种一对一的引用关系,一个对象的属性是另外一个对象的属性值,对象模型如下图所示:


        上图的Person类和IdCard类之间是一一对应的关系,一个人就只能有一个身份证,一个身份证只能对应一个人,并且身份证的标识同时也是人的标识,它所对应的关系模型也是一种一对一的关系,一张的主键也是这张表的外键,如下图所示:

        T_person表的主键id列同时也是T_idCard表的主键标识列,这就构成了外键关系,所以此时它们之间就是一种一对一的主键关联关系,那么反应到Hibernate中是如何实现的呢?
        Hibernate提供的这种映射关联中不但有<many-to-one>的关系,另外还提供了<one-to-one>的关系,它既是指一对一的关系。
        在实现时需要将标识字段设置为foreign,并将需要关联的对象的名称作为property参数写入到构造器中,并在最后添加<one-to-one>标签。具体代码如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2014-5-15 23:47:00 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.hibernate.Person" table="PERSON">
        <id name="id" type="int">
            <!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->
            <generator class="foreign">
                <!-- property只关联对象 -->
                <param name="property">idCard</param>
            </generator>
        </id>
        <property name="name"></property>
        <!-- 
            one-to-one标签指示Hibernate如何加载其关联对象,默认根据主键加载,也就是拿到关系字段值,根据对端的主键来加载关联对象
            
            constrained=true表示当前主键(person的主键)还是一个外键,参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
         -->
        <one-to-one name="idCard" constrained="true"></one-to-one>
        
    </class>
</hibernate-mapping>

        上面的示例中的<param name="property">idCard</param>指的是在Person.java中有一个idCard的属性,该属性是Person对象的一个关联对象,所以需要注册到foreign中,取得关联对象的标识。另外在<one-to-one>标签中添加了一个属性constrained="true",指示了Person对象的主键同时又是一个外键。具体的Person.java中的代码如下:
package com.hibernate;
 
public class Person {
    
    private IdCard idCard;
    public IdCard getIdCard() {
        return idCard;
    }
    public void setIdCard(IdCard idCard) {
        this.idCard = idCard;
    }
    
    private int id;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

     其中的idCard是Person对象的一个属性,所以在一对一主键关联映射时需要添加一个标识列。


结语

      上文介绍了两种一对一的映射,并且分别从对象模型和关系模型上进行了讨论,对于唯一外键的映射来说它是多对一映射的一种特殊情况,只需要在<many-to-one>中添加unique唯一键即可,另外还有唯一主键映射,这种其实需要<one-to-one>标签,然后在主键的属性中使用foreign生成策略,并在该映射中添加对应的关联对象。一对一的映射是还有很多种情况,将会在接下来的文章中讨论。
--------------------- 
作者:zhang_xinxiu 
来源:CSDN 
原文:https://blog.csdn.net/zhang_xinxiu/article/details/25950451 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate是一个Java持久化框架,它能够将Java对象映射到数据库中的表格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多和多对多的关系,我们可以通过以下方式进行映射一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系的映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间表来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间表中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表的表名和两个外键的列名。 总结:通过Hibernate的注解方式,可以方便地实现一对一、一对多和多对多关系的映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成表结构的功能,可以根据Java实体类来动态创建或更新对应的数据库表格,从而提高系统的可维护性和灵活性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值