Hibernate映射详解--一对一主键关联映射

本文详细介绍了在一对一主键关联映射中,人和身份证之间的关系如何通过实体类和映射文件实现,包括实体类实现、映射文件设置以及查询方式的不同。并对比了一对一主键关联映射与双向关联映射的区别。
   一对一主键关联映射:我们来拿人和身份证举例。采用一对一主键关联映射,他要表达的意思是人的id来自于身份证的id。要想在人的表中存数据,在身份证表中必须有对应的id的身份证记录。如图所示:

表关系为:

我们看一下具体的实现:

实体类实现:

                          public class Person {

 

                               privateintid;

   

                               private Stringname;

   

                             private IdCardidCard//提供关联的属性

                      ….省略getset方法

                 }

                            publicclass IdCard {                     

   

                                   private intid;

   

                                   private StringcardNo;

                          ….省略getset方法

                   }

 

对应的映射文件设置为:

Person.hbm.xml

<hibernate-mapping>

    <classname="com.bjpowernode.hibernate.Person"table="t_person">

        <idname="id">

            <!--采用foreign生成策略,forgeign会取得关联对象的标识,通俗点说就是person中这个主键id来自于idCard对象的主键。而从实体属性中可以知道idCardIdCard类型,即Person中主键来自于IdCard中的主键 -->

           <generatorclass="foreign">

               <!-- property只关联对象 -->

               <paramname="property">idCard</param>

           </generator>

        </id>

        <propertyname="name"/>

        <!--

            one-to-one指示hibernate如何加载其关联对象,默认根据主键加载也就是拿到关系字段值,根据对端的主键来加载关联对象    

            constrained="true表示,当前主键(person的主键)还是一个外键

 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句

         -->

        <one-to-onename="idCard"constrained="true"/>

    </class>

</hibernate-mapping>

      

IdCard.hbm.xml

<hibernate-mapping>

    <classname="com.bjpowernode.hibernate.IdCard"table="t_idCard">

        <idname="id">

            <generatorclass="native"/>

        </id>

        <propertyname="cardNo"/>

    </class>

</hibernate-mapping>

 

 

 

 

 

 

 

 

 

 

 

                                 

         采用一对一主键关联映射,两个实体的主键一样,这样就不需要加入多余的字段了。我们在加载维护关系的一端如例子中提到的Person时,从他的实体类实现也可以看出,要给他的IdCard属性赋值。但是赋值时,是不需要必须显示的用sessionsave将其变为Persistent状态的。因为一对一的主键关联映射已经为我们执行了此操作。也可以说他默认了cascade级联特性。说了一对一主键关联映射,自然也少不了双向关联映射。一对一主键双向关联映射和单向关联映射在存储方式上是没有什么不同的。但在查询上会稍有不同。看一下实现:

实体实现:

                         

    public class IdCard{

    

          privateintid;

   

         private StringcardNo;

   

        private Personperson//关联Person对象

         省略getset方法

}

                           

    public  class Person {

 

            privateintid;

   

            private Stringname;

   

            private IdCardidCard//关联IdCard对象

            省略getset方法

   }

       从实体类上来说,每端都能看到另一端的对象。查询的时候,我们自然可以从任意一段进行查询了。这是一点不同。再来看映射文件

IdCard.hbm.xml

<hibernate-mapping>

    <classname="com.bjpowernode.hibernate.IdCard"table="t_idCard">

        <idname="id">

            <generatorclass="native"/>

        </id>

        <propertyname="cardNo"/>

        <!--相对于单向,只是多了一句one-to-one -->

       <one-to-onename="person"/>

    </class>

</hibernate-mapping>

 

 

Person.hbm.xml

<hibernate-mapping>

    <classname="com.bjpowernode.hibernate.Person"table="t_person">

        <idname="id">

           <generatorclass="foreign">

               <!-- property只关联对象 -->

               <paramname="property">idCard</param>

           </generator>

        </id>

        <propertyname="name"/>

        <one-to-onename="idCard"constrained="true"/>

    </class>

</hibernate-mapping>

        可以看出Person的映射文件与单向关联是完全一样的。在单向关联中,我们只能从Person一端查询的时候才可以查询到IdCard端的值。如果我们只查询IdCard的属性,Person是不能被查询到的。而在双向关联中,我们则可以通过任意一端查询到另外一端的属性。单项和双项在这一区别上得到了验证。 

        一对一唯一外键关联映射请看下一篇博客。

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化与数据处理的自动化,以提升日常教学管理工作的效率与准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程与成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批与教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划与资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课与成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值