一、前言
在前几天中自己在学习ssh的过程中,发现Hibernate需要配置一个名字叫xxx.hbm.xml的文件,这个文件主要是使用Hibernate映射到相应的表。自然在这个文件里面会有表中相应的字段的名字的映射,这些就很好解决了,但是要有外键关联的话,就要添加many-to-one和one-to-many了,刚开始的时候小编也是模棱两可,所以通过博客来总结一下。
二、说说ER图中的一对多和多对一
说到数据库的设计就不可避免的使用ER图了,关于ER图小编粗略的向大家讲解一下。请看下面的这张ER图:
图一 ER 图实例
E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
它是描述现实世界概念结构模型的有效方法。是表示概念模型的一种方式,在ER图中有如下四个成分:
矩形框:表示实体,在框中记入实体名。
菱形框:表示联系,在框中记入联系名。
椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其名称下划一下划线。
连线:实体与属性之间;实体与联系之间;联系与属性之间用直线相连,并在直线上标注联系的类型。(对于一对一联系,要在两个实体连线方向各写1; 对于一对多联系,要在一的一方写1,多的一方写N;对于多对多关系,则要在两个实体连线方向各写N,M。)
这里小编重点指一下实体之间的关系,比如图中的管理员和栏目,一个管理员可以管理多个栏目,而一个栏目只可以有一个管理员管理,所以他们之间的关系是1:N。同理,如果一个管理员可以管理多个栏目,而一个栏目也可以由多个管理员管理,那么他们之间的关系就是N:M;
三、many-to-one和one-to-many
前面说完了ER图,相信大家会对数据库之间的关系有了更加深刻的了解,下面转入正题,首先看一下项目中数据库的关系图:
图二 数据库关系图
在数据库关系图中可以看出,订单表和商品之间是多对多的关心,所以产生了第三张表订单项,订单表和订单项表之间的关系是1:N的。如果使用了Hibernate的话,就要在xxx.hbm.xml文件中添加映射语句,下面小编就向大家展示一下如何做到映射:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入相关的约束-Ares-2016年11月21日21:49:11 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 使用Hibernate映射到相应的表-Ares-2016年11月21日21:50:46 -->
<hibernate-mapping>
<class name="cn.itcast.shop.order.vo.Order" table ="orders">
<!-- 表的主键-Ares-2016年11月21日22:07:31 -->
<id name = "oid">
<!-- 生成器-增长策略-自动生成-Ares-2016年11月21日21:55:03 -->
<generator class="native"/>
</id>
<!-- 配置其他普通属性-Ares-2016年11月21日21:55:55 -->
<property name="total"/>
<property name="ordertime"/>
<property name="state"/>
<property name="name"/>
<property name="addr"/>
<property name="phone"/>
<!-- 关联关系:与用户-Ares-2016年11月21日21:57:32 -->
<!-- 一个用户有多个订单-订单一方是多个-many to one -Ares-2016年11月21日21:58:06 -->
<!-- name 对应的关系名 class 外键对应的完全路径名 column 外表的主键-Ares -2016年11月21日22:01:10 -->
<many-to-one name="user" lazy="false" class="cn.itcast.shop.user.vo.User" column="uid"/>
<!-- 关联关系:与订单项-Ares-2016年11月21日21:57:32 -->
<!-- 一个订单里面可以包含多个订单项-订单为一个-one to many -Ares -2016年11月21日22:02:56 -->
<!-- 级联保存-cascade="save-update"-不用依次级联-Ares-2016年11月25日22:23:59 -->
<set name="orderItems" lazy="false" cascade="save-update">
<key column="oid"/>
<one-to-many class="cn.itcast.shop.order.vo.OrderItem"/>
</set>
</class>
</hibernate-mapping>
字段说明:
< hibernate-mapping > 元素:对象-关系映射文件的根元素,其他元素必须嵌入在< hibernate-mapping >元素之内。
< class >元素:< class >用于添加持久化类。
< id >元素:设定持久化类中定义的对应数据库表主键字段的属性到数据库表字段的映射。
< property >元素:设定持久化类的属性和数据库表的字段的映射。
核心字段说明完了,我们说说实体关联映射:
图三 对应关系类图
类图说明:
一个房间可以有0个或多个用户使用,但是一个用户只能使用一个房间。
一对多单向关联关系
思路:在“多”的一端加入一个外键指向“一”的一端,维护关系是“一”指向“多”。
由于房间和用户是1对多,所以要在房间所对应的xxx.hbm.xml文件中添加一对多的映射:
<set name="user" >
<key column="user_id"/> //外键,即user表的主键
<one-to-many class="user"/> //要映射的表的名字
</set>
多对一单向关联关系
思路:在“多”的一端加入一个外键指向“一”的一端,维护的关系是“多”指向“一”。
同理由于用户和房间是多对一,所以也要在用户所对应的xxx.hbm.xml文件中添加多对一的映射:
//lazy: 延迟加载
//class:room类的全路径
//column:room类的主键
<many-to-one name="room" lazy="false" class="room" column="room_id"/>
四、小结
总之不要放过任何一个细节,前天李爽师姐去面试,面试官就问的这个问题,多以还是要提起自己的细心的。加油!