Hibernate对象关系映射(一)
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端
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。