Hibernate是一种能实现ORM的框架。ORM即Object
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>标签,此标签不影响存储,只影响加载。所以上面四种关系可以看成是两种关系,主键关联和唯一外键关联。而主键关联和唯一外键关联的区别是主外键的关系,前者是Person中id是主键又是外键,后者是添加一个关系字段作为外键。但是都是Person来维护关系。
通过总结,对比之后特别清晰,简单易懂。下篇博客继续分析。
【Hibernate学习】 ——ORM(一),布布扣,bubuko.com