继上篇博客
一对一关系映射:一对一关联映射在实际生活中是比较常见的,如人与身份证的关系,通过人这个对象可以找到他相关的内容。
一对一单向(主键):
单向一对一主键关联,靠的是它们的主键相等,从Person中能看到IdCard,也就是把t_idCard中的主键拿过来当做t_Pseron的主键。
如图的线表示一个关联,在person中可以看见idcard。即在person中持有idCard的引用
person类的映射关系
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> <generator class="foreign"> <!-- 指关联对象 --> <param name="property">idCard</param> </generator> </id> <property name="name"></property> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载也就是 拿到关键字段值,根据对端的主键来加载关联对象 constrained=true表示,当前主键(person的主键)还是一个外键,参照了对端的主键 (IdCard的主键),也就是会生成外键约束 --> <one-to-one name="idCard" constrained="true"></one-to-one> </class> </hibernate-mapping>
IdCard的映射关系
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
一对一双向(主键):
一对一双向主键关联与一对一单向主键关联的区别就是,一对一单向主键关联,在person端能看到idCard,而idCard不能看到Person端。而双向关联就是在idCard端也能看到person,也就是不但在Person.hbm.xml中加上<one-to-one>标签,同时在IdCard.hbm.xml文件中加上<one-to-one>标签。代码如下所示。
IdCard的映射关系
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person"></one-to-one> </class> </hibernate-mapping>
一对一单向映射(唯一外键关联)
一对一单向唯一外键关联,也就是多对一关联的特例,把多的一端限制为一,就是一对一唯一外键关联。同多对一一样,在一端加入另一端的并采用<many-to-one>标签,通过unique="true",这样来限制了多的一端为一。
person的映射关系:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"> </generator> </id> <property name="name"></property> <many-to-one name="idCard" unique="true"></many-to-one> </class> </hibernate-mapping>
IdCard的映射关系:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
即在t_person端加上一个外键字段idCard,限制idCard的唯一性就是一对一唯一外键关联。
一对一双向(唯一外键关联)
一对一唯一外键单向关联我们已经了解了,双向反过来就是在没有的一端加上就可以了。
IdCard的映射关系:
<hibernate-mapping> <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载也就是 拿到关键字段值,根据对端的主键来加载关联对象 property-ref="idCard"拿本端的id和对端的idCard进行关联 --> <one-to-one name="person" property-ref="idCard"></one-to-one> </class> </hibernate-mapping>
从上述中可以总结出,对于一对一关联映射,主键关联和唯一外键关联单向和双向产生出的表结构是一样的,不同的是在加载的时候不同。也就是一对一双向关联和一对一单向关联的相比,只是改变了一对一关联映射的加载,而没有改变存储。
下面再来对比一下主键关联与唯一外键关联:
主键关联:即让两个对象具有相同的主键值,来表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。
唯一外键关联:外键关联本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一的关联关系
One2one不破坏表结构,不会再任何一端添加字段,只是在查找时,一起查找上来而已。主键关联不会改变存储,但是唯一外键关联会影响存储。对于如何选择,建议使用唯一外键关联!主键关联不易扩展,两个类间的依赖性太强。
下篇继续!
浅谈Hibernate关系映射(2)