Hibernate对象关系映射(一)

Hibernate的本质是对象关系映射,ORM实现了将对象的变化保存到数据库中。以前我们对关系表操作,执行增CRUD。现在我们不在对关系表进行操作,而是直接对对象操作。对象关系的映射有以下几种

基本图形


1

一对一映射

分两种情况

主键

唯一外键

1主键

 两个对象具有相同的主键,不再有额外字段维护他们的关系


2 

PersonCard之间,他们的主键是相同的

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端

 

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