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表的关联关系,并没有额外的内容。