Hibernate框架常用映射

来源:互联网 发布:淘宝手机在哪实名认证 编辑:程序博客网 时间:2024/06/16 06:57

       简介:Hibernate是一个典型的开源ORM框架,ORM(Object Relational Mapping)即对象关系映射,它是对JDBC的进一步封装,将在工程中创建的对象模型与数据库数据库的表建立映射关系,它会自动生成SQL语句并执行,在数据库中创建出相对应的表。这样就可以通过面向对象的思维进而操作数据库。

       基本介绍:首先Hibernate中相当于提供了一个工厂即SessionFactory,这个工厂可以创建Session对象,而创建出来的Session对象通过save,delete,update,get等方法包装了基本SQL语句,如此一来就可以通过这些基本方法对对象进行增删改查操作。除此之外Hibernate还封装了关于事务控制的操作,只需要在事务边界进行声明即可。

       关系配置:

1、多对一:

       多对一的关联映射,是很常用的一种关联映射,例如:学生对班级就是多对一的关联映射,在数据库中的表现形式为:在学生表中会有一个外键字段(classId)指向班级表,参照班级表的主键,而在对象模型中的体现为在学生的Demo类中会持有班级Demo的一个引用,作为学生Demo类的一个属性存在。

其映射关系配置如下:

在学生Demo类的映射文件中配置为:

<hibernate-mapping><class name="com.rcj.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/><many-to-one name="class" column="classid" cascade="save-update"/></class></hibernate-mapping>
       其中在<many-to-one>标签中的cascade为级联配置,表示在做添加和更新时做级联操作,级联的意思为:当一个表发生更新时,其他引用该表相关字段的表也会随之更新。该操作在树形结构中子父关系的操作中十分常用,而且十分方便。除了可以配置为save-update(添加和更新时级联操作)之外,还可以配置为:all(所有操作都级联),delete(删除级联),none(所有操作都不级联)。

在班级Demo类的映射文件中配置为:

<hibernate-mapping><class name="com.rcj.hibernate.Class" table="t_class"><id name="id"><generator class="native"/></id><property name="name"/></class></hibernate-mapping>


2、一对多:

         一对多的关联映射也很常用,一对多的关联映射和多对一的关联映射原理是相同的,他们都是在多的一端维护关系,就是多的一端有一个外键指向一的一端。区别只是:指向不同而已,即加载时机不同,被指向的一方会随着主动指向的一方的加载而记载。其配置文件如下:

在学生Demo类的映射文件中配置如下:

<hibernate-mapping><class name="com.rcj.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/><many-to-one name="classes" column="classesid"/></class></hibernate-mapping>
在班级Demo类的映射文件中配置如下:

<pre name="code" class="html"><hibernate-mapping><class name="com.rcj.hibernate.Classes" table="t_classes"><id name="id"><generator class="native"/></id><property name="name"/><set name="students" inverse="true"><key column="classesid"/><one-to-many class="com.rcj.hibernate.Student"/></set></class></hibernate-mapping>

       在此说明一下其中的inverse属性:inverse属性设置为true的作用表示,本端不再维护关系,交由另一端维护关系,这个不是必须的,但是配置是为了提高性能,如果不配置该项会导致在添加班级的过程中执行大量无用的update语句,所以配置上该项可以提高性能。而且需要注意的是:key标签和上边的many-to-one标签中的column字段需要一致,否则会导致表结构混乱,因为这是同一个字段的说明。


3、一对一:

       一对一有主键关联映射和唯一外键关联映射,常用的为唯一外键关联,下面以一个人一个身份证为例来说明唯一外键关联映射。

       其实一对一唯一外键关联映射为多对一映射的一个特例。下面先看看其配置文件。

人的Demo类的配置信息:

<hibernate-mapping><class name="com.rcj.hibernate.Person" table="t_person"><id name="id"><generator class="native"/></id><property name="name"/><many-to-one name="idCard" unique="true"/></class></hibernate-mapping>
身份证Demo类的配置信息:

<hibernate-mapping><class name="com.rcj.hibernate.IdCard" table="t_idCard"><id name="id"><generator class="native"/></id><property name="cardNo"/><one-to-one name="person" property-ref="idCard"/></class></hibernate-mapping>
其配置的特点为:在many-to-one标签中添加了unique属性,用来限制多的一段不重复,就构成了一对一的关联映射。下边的one-to-one标签表示IdCard类对Person类的一种指向关系,因为在这里是一种双向关联关系。

4、多对多:

       多对多的关联映射在数据库中的体现为:数据库中会新建一个表来维护两个表之间的关系,在对象模型中的体现为,双方各持有对方的一个set集合引用。下面就是其配置信息。

学生Demo类配置信息

<hibernate-mapping><class name="com.rcj.hibernate.Student" table="t_student"><id name="id"><generator class="native"/></id><property name="name"/><set name="courses" table="t_student_course"><key column="student_id" not-null="true"/><many-to-many class="com.rcj.hibernate.Course" column="course_id" /></set></class></hibernate-mapping>
课程Demo类配置信息

<pre name="code" class="html"><hibernate-mapping><class name="com.rcj.hibernate.Course" table="t_course"><id name="id"><generator class="native"/></id><property name="name"/><set name="students" table="t_student_course"><key column="course_id" not-null="true"/><many-to-many class="com.rcj.hibernate.Student" column="student_id"/></set></class></hibernate-mapping>

此处需要注意的是:由于双方配置的表名是同一个表,所以表名一定要相同。


0 0