ORM进阶:映射文件编写(上)-基本映射
来源:互联网 发布:北大医学部知乎 编辑:程序博客网 时间:2024/06/04 05:31
上一篇文章中提到,使用Hibernate做OR映射,最主要的就是编写hbm映射文件。即:实体到数据库表的转化关系。
这篇文章将讲述,一些常见映射文件的编写,以及需要注意的地方。
对于关系模型的建立。即实体的映射关系,通过OR映射,将实体关系模型,转换成关系对象模型。
常用的三种映射方式
- 一对一
- 一对多,多对一
- 多对多
对与上面的几种情况。最常用的是多对一关联映射。
ER关系模型中
1、多对多往往是拆分成两个一对多的关系,通过生成一个关系表来处理多对多的关系。
2、一对一的关系,虽然也很常见,比如:人和卡的关系。但是难免需求发生变化,即一个人可以拥有多张卡。此类问题,一对一的关系将变成一对多的关系。
简单来说:一对一关系,是一对多关系的特例。
一对一关联映射
最主要的标签的使用,首先我们先看一下要达到的关系结构:
如上图,将建立一个一对一的关联映射。即person维护card的信息。保持一致性。
person类的映射文件,建立一对一的关系,并维护关系:
<class name="com.demo.hibernate.Person" table="t_person"> <id name="id"> <!-- 该主键采用foreign生成策略,foreign会取得关联对象的表示 --> <generator class="foreign"> <!-- property只关联对象(使用card的主键) --> <param name="property">idCard</param> </generator> </id> <property name="name"/> <!-- one-to-one标签,指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained="true" 表示,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard), 也就是会生成外键约束语句 --> <one-to-one name="idCard" constrained="true"/> </class>
card类的映射文件
<class name="com.demo.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="CardNo"/> </class>
多对一关联映射
多对一的关系,维护端在多的一方,而且需要维护的字段也在多的一方,所以配置如下:
<class name="com.demo.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="group" column="groupid" cascade="save-update"/> </class>
<class name="com.demo.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class>
该种 关系,唯一需要注意的就是,需要在多的维护关系,而且也是多的一端添加一个字段。
所以多对一的关系需要做的是:在多的一端添加标签。
一对多关联映射
对于一对多的关系,需要一的一端来维护关系,即在一中存在一个集合,用于保存多的关系。
即,一的一端hbm为,添加一个用于维护该关系:
<class name="com.demo.hibernate.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"></key> <!-- 在student中加入一个外键 --> <one-to-many class="com.demo.hibernate.Student"></one-to-many> </set> </class>
另一端的关系,被一的一端维护,所以多的一端hbm如下:
<class name="com.demo.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="classes" column="classesid"/> </class>
添加标签,是为了在多的一张表中添加一个字段,用于维护该关系。
多对多关联映射
多对多的关系,即特殊的就是那个关系表。主要是配置关系表。
以下是维护关系一方的hbm文件:
<hibernate-mapping > <class name="com.demo.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="user_id"/> <many-to-many class="com.demo.hibernate.Role" column="role_id"/> </set> </class></hibernate-mapping>
被维护方hbm文件:
<class name="com.demo.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class>
总结
<many-to-one>
会在本类生成的表中生成一个字段,用于维护该关系。
<one-to-many>
会在指定类生成的表中生成一个字段,用于维护关系。
<many-to-many>
因为会生成一个不是类的关系表。所以<many-to-many>
需要指定新表的名称,和与本类相关联的字段名。在这个关系中需要注意:多对多关系的 两个类,都要设置 <many-to-many>
关系,而且表名需要一致。
对于以上几种映射,也就几个标签的使用。<one-to-one> <many-to-one> <one-to-many> <many-to-many
>的使用。通过名字很容易就可以想到这些标签。
只有以上关联映射,可以解决很多问题。但是对于需求复杂的,仅仅使用以上几种会有些困难。下篇,我们看一下其他的映射如何编写。
- ORM进阶:映射文件编写(上)-基本映射
- ORM进阶:映射文件编写(下)-继承映射
- ORM进阶之Hibernate中关系映射
- ORM进阶之Hibernate中关系映射
- ORM映射
- 【hibernate进阶】hibernate基本映射
- 【Java.JDBC/ORM】Hibernate 映射文件详解
- .NET进阶——浅谈ORM的映射方案
- ORM 对象关系映射
- orm实体映射
- ORM 对象关系映射
- ORM对象关系映射
- 对象关系映射ORM?
- ORM-对象关系映射
- ORM对象/关系映射
- hibernate的ORM映射
- 五、(四)ORM映射
- ORM:对象关系映射
- 可重入函数与线程安全函数
- 【杭电】1013【 Digital Roots】 犯下的错误
- 分享一个链接
- UITextField
- HDU 5217 Brackets 线段树
- ORM进阶:映射文件编写(上)-基本映射
- Rust - Reference counted and raw pointers | 引用计数和原始指针
- Android的消息机制之ThreadLocal的工作原理
- 黑马程序员——Objective--C笔记之封装 继承 多态
- OC09_内存高级&集合
- 关于静态cell的使用
- 93 汉诺塔(三)【模拟】
- Android应用资源系列之属性(Attribute)资源
- Ubuntu14.04下,Tomcat8+Nginx+memcache配置服务器集群session共享