Hibernate的本质是对象关系映射,ORM实现了将对象的变化保存到数据库中。以前我们对关系表操作,执行增CRUD。现在我们不在对关系表进行操作,而是直接对对象操作。对象关系的映射有以下几种
基本图形
图1
一对一映射
分两种情况
主键
唯一外键
1主键
两个对象具有相同的主键,不再有额外字段维护他们的关系
图2
Person和Card之间,他们的主键是相同的
2唯一外键
其实是用来表示多对一的,如果加上唯一限制,就可以表示一对一关联
图3
图3可以看到卡号在person中充当了一个外键。
根据分类的情况,还可以更细致的划分,每个分类都对应着一种单向和双向的选择,就是图1。
认识了基本的一对一关系映射,我们在开看看他们的配置关系,重点还是在Hibernate.hbm.xml文件的配置
1.1主键单向关联
<classname="com.bjpowernode.hibernate.Person"table="t_person">
<idname="id">
<!--采用foreign生成策略,foreign会取得关联对象的标识 -->
<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>
IdCard.hbm.xml
<hibernate-mappingpackage="org.hibernate.auction">
<classname="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<idname="id">
<generatorclass="native" />
</id>
<propertyname="cardNo"/>
</class>
</hibernate-mapping>
1.2主键双向关联
因为是单向,所以只要一端进行维护。
区别是一对一双向主键关联与一对一单向主键关联的区别就是,一对一单向主键关联,在person端能看到idCard,而idCard不能看到Person端。而双向关联就是在idCard端也能看到person,也就是不但在Person.hbm.xml中加上<one-to-one>标签,同时在IdCard.hbm.xml文件中加上<one-to-one>标签。
<hibernate-mappingpackage="org.hibernate.auction">
<classname="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
<one-to-onename="person"/>
</class>
</hibernate-mapping>
2.1唯一外键单向关联
一对一单向唯一外键关联,也就是多对一关联的特例,把多的一端限制为一,就是一对一唯一外键关联。同多对一一样,在一端加入另一端的并采用<many-to-one>标签,通过unique="true",这样来限制了多的一端为一。
IdCard.hbm.xml
<hibernate-mappingpackage="org.hibernate.auction">
<classname="com.bjpowernode.hibernate.IdCard" table="t_idCard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
Person.hbm.xml
<hibernate-mappingpackage="org.hibernate.auction">
<classname="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<!-- 采用foreign生成策略,foreign会取得关联对象的标识-->
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="idCard"unique="true"></many-to-one>
</class>
</hibernate-mapping>
双向关联是在在没有的一端加上就可以了。我们的IdCard.hbm.xml中采用<one-to-one>标签
小结:
综上所述,可以看出,同一类映射,无论是单向还是双向,他们的存储结构是相同的,之所以映射文件不同,是因为加载时不同(在增删改时)。如:A对B,A就是主动方,A主动想要了解B的情况,这样把B设置到A端