详解一对一关系映射

        Hibernate其实就是ORM的一种实现方式,其表达的就是实体和关系之间的一种关系。比方说实体之间有几种关系:一对一,多对一,多对多。而在下面要说的就是一对一关系映射,其分两种情况:主键映射和外键映射
1、主键映射:(person的id即是主键,又是IdCard的外键)
             
        
          1 Person -IdCard (单向关联,关系在 Person
             iIdCard:
                                <hibernate-mapping>
    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
    </class>
</hibernate-mapping>
                        ii、Person:
                                    <hibernate-mapping>
    <class name="com.tgb.hibernate.Person" table="t_person">
        <id name="id" type="integer">
            <!-- 采用foreign生成策略,foreign会取得关联对象的标识 -->
            <generator class="foreign" >
                <!-- property指关联对象 -->
                <param name="property">idCard</param>
            </generator>
        </id>
        <property name="name" />
        <!-- 
            one-to-one指示hibernate如何加载其关联对象,默认根据主键加载
            也就是拿到关系字段值,根据对端的主键来加载关联对象
            
            constrained="true"表示,当前主键(Person的主键)还是一个外键
            参照了对端的主键(IdCard的主键),也就是会生成外键约束语句
         -->
        <one-to-one name="idCard" constrained="true" />
    </class>
</hibernate-mapping>
     2Person-IdCard(双向关联,关系在Person),其余关系不变,只需要在IdCard关系端加入person的引用即可:
            <hibernate-mapping>
    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
        
         <!-- 关联Person端 -->
        <one-to-one name="person" />
    </class>
</hibernate-mapping>
2、外键映射:就是在person的一端加入idCard的主键作为外键
             
    
             1 Person -IdCard (单向关联, many-to-one 的特殊形式,关系维护在person端)
            iIdCard

            <hibernate-mapping>

    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
    </class>
</hibernate-mapping>
                                     ii Person
                                                <hibernate-mapping>
    <class name="com.tgb.hibernate.Person" table="t_person">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="name" />
        
        <many-to-one name="idCard" unique="true" />
    </class>
</hibernate-mapping>
      2Person-IdCard(双向关联): 其余关系不变,只需 在IdCard端添加对Person的关联即可
<hibernate-mapping>
    <class name="com.tgb.hibernate.IdCard" table="t_idCard">
        <id name="id">
            <generator class="native" />
        </id>
        <property name="cardNo" />
        
        <one-to-one name="person" property-ref="idCard" />
    </class>
</hibernate-mapping>   
3、当然有了上面的关系还是不行的,它不会自动映射到数据库中生成我们要的表,所以在此我们还需要一个工具类帮助我们在数据库中生成表,如下:
          public   static   void  main(String[] args) {

        // 默认读取hibernate.cfg.xml文件
        Configuration cfg =new Configuration().configure();
        
        SchemaExport export =new SchemaExport(cfg);
        
        export.create(truetrue);
    }
    
总结:通过配置上面的操作,我们就可以将其导入到数据库中生成表。虽然看着有点麻烦,其实还是很简单的。一对一说完了,结下来就要说多对一了,敬请期待...
         

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值