SSH-Hibernate(二)—关系映射(上)
关系映射的理解
上篇博客说过ORM是一种持久化的解决方案,它的思想呢就是将关系数据库中的表的记录映射到JAVA对象中。直白的说就是JAVA对象和关系数据库中的记录建立起了固定的对应关系,对象即记录!这样做的带来的最直接的表现就是,开发人员可以以面向对象的思想来操作关系型的数据库。对象对应的是数据表中的记录,而在关系数据库中记录和记录之间存在着一对一、一对多、多对多等关系。ORM映射也需要保存这些记录之间的关系,它主要通过面向对象中关联关系来实现,继承关系是比较特殊的一种反应记录之间关系的形式。下面从一对一关系映射开始吧。
一对一关联映射
主键关联:两张表共享主键,即主键同步
Person类public class Person { private String id; private String name; private IdCard idCard; //省略set、get方法 }IdCard类
public class IdCard { private String id; private String securityBureau; private Person person; //省略set、get方法 }Person.hbm.xml配置:
<hibernate-mapping> <class name="com.tgb.Person" table="Persons"> <id name="id" column="id" type="string"> <!--这里生成策略不要纠结,假设它产生身份证号码--> <generator class="uuid"></generator> </id> <property name="name" column="name" type="string"></property> <!--使用<one-to-one>表示一对一关联--> <one-to-one name="idCard" class="com.tgb.IdCard" cascade="all"></one-to-one> </class> </hibernate-mapping> <span style="font-family: FangSong_GB2312; background-color: rgb(255, 255, 255);"> </span>IdCard.hbm.xml配置:
<hibernate-mapping> <class name="com.tgb.IdCard" table="idCards" > <id name="id" column="id" type="String"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="securityBureau" column="securityBureau" type="string"></property> <!-- 一对一关联 --> <one-to-one name="Person" class="com.tgb.User" ></one-to-one> </class> </hibernate-mapping>
由于采用了主键关联方式,两张表的主键值须保持同步。这也就是说,我们只需为一张表设定主键生成策略,而另一张表的主键与之共享就可以了。但是idCards表中的主键id并不是参照persons表id的外键。
虽然在Pserson类和IdCard类之间有互相引用关系,但是数据库端persons和idCards表没有任何参照关系,只是当我们保存User对象时,若User中的idCard属性值不为NULL,此时Hibernate就会以Use.hbm.xml中使用的主键生成器生成的主键值作为向users表和idCards表中插入记录的主键值,此时保持了关联记录的主键值的同步(由输出的SQL语句可知这是由Hibernate处理的,数据库并不知情)
唯一外键关联:是一种限制的一对多关联,即在多的一端设置唯一
因为唯一外键关联和一对多关联的特殊关系放到下篇博客来说!总结:映射关系的本质是通过Java中对象间的关系来体现其在数据库中记录和记录之间的关系,这种关系映射涉及到了数据库中的主键和外键等的使用来保证一对一的关系。因为在数据库中记录的唯一性和主键相关。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。