• 【Hibernate学习】 ——ORM(一)


               Hibernate是一种能实现ORM的框架。

    ORMObject Relational Mapping,对象关系映射。

    也就是将关系数据库中表的数据映射成为对象,也就是说将表与表之间的操作映射成对象与对象之间的操作,通过实体类来达到操作表的目的。

    总之就是把对数据库的操作转化为对对象的操作,从而更体现了面向对象的思想。

     

              一对一关联映射策略包含主键关联和唯一外键关联。

     

    单向一对一


             主键关联

              让两个对象有同样的主键值。表名它们之间的一对一关系。数据库没有额外的字段来维护它们之间的关系。只通过表的主键来关联。例如以下图:通过两个表中id来维护关系,没有额外的字段或者表去维护其之间的关系。



            从图中可看出,既然是单向关联。那么Person能够持有IdCard对象。而IdCard对象不知道Person的存在。

    故因此由Person端来维护关系。


    Person.hbm.xml关系代码

    <class name="com.bjpowernode.hibernate.Person" table="t_person">
    	<id name="id">
    	   <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>
    


    IdCard.hbm.xml代码

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

          唯一外键关联

             外键关联被拿来是用于多对一的配置,可是假设加上唯一的限制之后。也能够用来表示一对一的关联关系。因此唯一外键关联是多对一的一种特殊情况。

    是通过<many-to-one>映射的。

     

            表关系:

              通过<many-to-one>映射,会在person端生成idCard字段。通过idCard字段来维护关系。unique表示是唯一外键关联。故还是通过person端来维护关系,所以和主键关联对照仅仅须要更改person关系中的标签为<many-to-one>,不须要更改idCard关系代码。

     

    主要改变的是Person类的映射:

    <class name="com.bjpowernode.hibernat.Person" table="t_person">
    	<id name="id">
    		<generator class="native"/>
    	</id>
    	<property name="name"/>
    	<!--设置idCard为外键,唯一标识为true-->
    	<many-to-one name="idCard" unique="true"/>
    </class>
    

              

           小结:通过表关系能够看出来,主键关联是通过person表中的id来维护关系,没有多余的字段,相当于id既当主键又当外键,改动数据非常难;而唯一外键关联是增加第三个字段来维护关系。可扩展性显然比主键关联好。

     

     

           ——————————————————————————————————————————————

     

    双向一对一

            主键关联

             上面是单向的。那么设置成双向的,也就是IdCard也想得到与之相应的Person对象。那么IdCard就须要增加person属性。例如以下:


    Person关系映射同主键关联映射。


    idCard关系映射:

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

              比起单向关联外,双向关联的关系在IdCard端增加<one-to-one>标签。idCard也持有Person的引用。

    <one-to-one>标签不影响存储。仅仅影响载入,故单向关联和双联关联的表结构是一样的。

     

          唯一外键关联

     

            表关系:

    同单向关联的关系一样,生成的表结构也一样。

    person关系代码同单向。


    idCard关系代码:

    <class name="com.bjpowernode.hibernate.Person" table="t_idCard">
    	<id name="id">
    	   <generator class="native">
    	</id>
        <property name="cardNo"/>
    	<!--体现双向关联-->
    	<one-to-one name="person" property-ref="idCard"/>
    </class>
    


              相同是在idCard端增加关联<one-to-one>标签。

    须要加如property-ref="idCard",为关系字段的名称。由于idCard不为主键。所以要增加此属性。

     

      ———————————————————————————————————————————————

     

     

              综上,单向和双向的差别就是对关系的持有,idCard端加入<one-to-one>标签,此标签不影响存储,仅仅影响载入。所以上面四种关系能够看成是两种关系,主键关联和唯一外键关联。而主键关联和唯一外键关联的差别是主外键的关系,前者是Personid是主键又是外键。后者是加入一个关系字段作为外键。可是都是Person来维护关系。

     

             通过总结,对照之后特别清晰,简单易懂。下篇博客继续分析。


  • 相关阅读:
    用JavaDoc生成项目文档
    thymeleaf参考手册
    转的一个Java基本功
    杂记
    修改Esxi克隆的CentOS的IP地址
    CentOS搭建socket5代理服务器
    CentOS上搭建Nginx + Mono 运行 asp.net
    启动PPT的时候一直配置vs2013的问题解决
    swift 元组
    swift 集合类型(二)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7241604.html
Copyright © 2020-2023  润新知