Hibhibernate中的映射关系分析汇总

1.什么叫做映射?

              关联关系表示不同类的对象之间的结构关系,它在一段时间内将多个类的实例连接在一起(这与依赖关系不同,依赖关系表示两个实例之间的临时关联关系)。
2.进行映射的好处?

          在Hibernate中关联关系表现在所映射的表与表之间的关系,采用关联操作,能够使有关系的表之间保持数据的同步,同时,关联操作能够使程序员在编写程序过程中,减少对多表操作代码的编写,并且优化了程序,提高了程序运行的效率。

3.Hibernate中关联关系的类型

   1、 一对一关联    假设有两个实体,分别是客户对象(Customer)和客户身份对象(Certificate),它们之间就是一对一的关系。一个客户只能有一个身份,一个身份也只能对应一个客户。该一对一关联可以分为两种,分别是以主键关联和以外键关联

           a.以主键关联:所谓以主键关联,是指两张数据表通过主键取得一对一的关联关系(其中一张表的主键是引用另一张表主键的外键),两张表的主键值必须相同.

                下面是以主键关联的Customer和Certificate的映射文件:

● Customer.hbm.xml:

 <hibernate-mapping>  

    <class name="hibernate.Customer" table="customer" schema="dbo" catalog="test">

        <id name="id" type="java.lang.Long">  

         <column name="id" />     

      <generator class="uuid.hex" />  

     </id>      <!--映射对应的身份对象-->

      <one-to-one name="Certificate"  class="hibernate.Certificate"      update="true" insert="true"  fetch="select" cascade="all"/> 

    <property name="name" type="java.lang.String">  

      <column name="name" length="50" not-null="true" />    

   </property>  

  </class>

</hibernate-mapping> 
 ● Certificate.hbm.xml:

 <hibernate-mapping>

<class name=“hibernate.Certificate” table=“certificate” schema=“dbo” catalog=“test”>

<id name=“id” type=“java.lang.Long”>

 <column name=“id” />

<!—引用Customer的主键作为Certificate的主键和外键--

 <generator class=“foreign” />

<param name=“property”>Customer</param>

</generator>

</id> <property name=“information” type=“java.lang.String”>

<column name=“information” length=“50” not-null=“true” />

 </property>

<one-to-one name=“Customer” class=“hibernate.Customer” constrained=“true”<!—表示Certificate引用了Customer外键作主键-->

</class>

</hibernate-mapping>

   b.以外键关联:两张表的主键值不同,它使用一个新添加的字段来作为外键维持一对一关系。 下面是以外键关联的Customer和Certificate的映射文件: 
     ● Customer.hbm.xml是同以主键关联中的Customer映射文件一样。

    ● Certificate.hbm.xml:

<hibernate-mapping>  

<class name="hibernate.Certificate" table="certificate"  schema="dbo" catalog="test">  

 <id name="id" type="java.lang.Long">    

<column name="id" />    

<generator class="uuid.hex" />    

<param name="property">Customer</param>    

</generator>   

</id>   <property name="information" type="java.lang.String">    

<column name="information" length="50" not-  null="true" />   

</property>  

 <many-to-one    name="Customer"class="hibernate.Customer"   

<!--uique设为true,表示由多对一变成一对一-->  uique="true" column="customer_id">
</many-to-one>

 </class>

</hibernate-mapping>

 

以外键关联的一对一,其实本质上变成了一对多的双向关联,编写时直接按照一对多和多对一的要求编写,最后在many-to-one这一边加上一个uique=“true”,说明它是一对多的特例。

  one-to-one 节点有以下属性:
     cascade :操作级联(cascade)关系,可选值有
  all:所有情况下均进行级联操作;
  none:所有情况下均不进行级联操作;
  save-update:在执行save-update时进行级联操作。
  delete:在执行delete时进行级联操作。
  级联(cascade)在Hibernate映射关系中是个非常重要的概念。它指的 是当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。  如对主控对象调用save-update或delete方法时,是否同时对关联对象 被动方)进行save-update或delete。这里,当客户(Customer)被 更新或者删除时,其所关联的订单(Order)同时被修改或者删除,因 此,这里的级联关系设置为all.

   constrained: 约束表明主控表的主键上是否存在一个外键(foreign key)对其进行约束。这个选项关系到save、delete等方法的级联操作顺序。默认为关联类的主键属性名。

 

2、 一对多关联/多对一关联    一对多和多对一关联分为单向关联和双向关联,在此,着重介绍双向关联。假设有两个实体,客户对象(Customer)和订单对象(Order),一个客户可以有多个订单,表现为一对多的关系,一个订单只能属于一个客户,表现为多对一的关系 。

 

3、 多对多关联
 Hibernate关联关系中相对比较特殊的就是多对多关联,多对多关联与一对一关联和一对多关联不同,多对多关联需要另外一张映射表用于保存多对多映射信息。

由于多对多关联的性能不佳(由于引入了中间表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用。同时,在对多对关系中,应根据情况,采取延迟加载机制来避免无谓的性能开销。

多对多关联只有双向关联,假如有订单对象(Order)和产品对象(Product),一个订单可以对应多个产品,一个产品同样也可以对应多个订单,订单和产品的关系就属于多对多关联关系。

为表示它们之间的关系,还需建立一张订单—产品关系表(Order_Product),这张表里只存储order表和product表的关联关系,并没有额外的内容。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值