在开始讲述关联映射之前,先来介绍一下ORM的概念。ORM:Object Relational Mapping,对象关系映射。
ORM的系统主要实现对象到关系数据库的映射,然后开发人员可以通过操纵对象,进而间接的操纵数据库。
Hibernate框架实现ORM主要用到了:java实体(*.java)、映射文件(*.hbm.xml)和数据库的配置文件(hibernate.cfg.xml)三个文件。它们的作用如下:
Java实体类:它是有数据类型的数据存储的属性,并可以通过getter和setter方法访问这些属性。
映射文件:它是Java实体与数据库表的映射,包括实体与表的对应;实体属性、实体之间对应关系和数据库表字段的对应关系等。
数据库配置文件:它是指定与数据库连接时需要的连接信息,包括数据库类型、用户名和密码、连接字符串、实体类的映射地址等。
上文已经讲述,关联映射中一共有:一对多、一对一、多对一、多对多四种关联映射。今天先来看一对多关联映射。
多对一的映射原理是:在多的一端加入一个外键指向一的一端,如果维护了多指向一的关系,那么加载多的时候会吧一加载上来。
多对一的现象也是最多、最常见的。比如一个组里面可以有多个用户,而一个用户只能属于一个组。假如用多对一的映射来维护该关系,也就是说,每个用户只能属于一个组,存储的时候,只能在多的一端(用户端)加载组。
实体组Group:
package com.lzq.hibernate; public class Group { private int id; private String name; 此省略getter和setter方法 }
实体用户User:
package com.lzq.hibernate; public class User { private int id; private String name; private Group group; 此处省略getter和setter方法 }
组映射Group.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.lzq.hibernate.Group" table="t_group"> <id name="id"> <generator class="native" /> </id> <property name="name" /> </class> </hibernate-mapping>
用户映射User.hbm.xml:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.lzq.hibernate.User" table="t_user"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <!-- many-to-one映射多对一的关系,并将外键关系表字段重命名为groupid--> <many-to-one name="group" column="groupid" cascade="save-update" /> </class> </hibernate-mapping>
此处实体皆省略getter和setter方法。
也就是说,多对一关系就是在多的一端(User)加入了“many-to-one”标签。
注:1、cascade是级联的意思。
假如现在要将“小明属于信息技术提高班”中的信息进行存储,存储时,必须将组和用户的名字都变成persistent状态,才能完成正确存储;如果组是transient状态,存储时就会抛出TransientObjectException异常。
现在设置了cascade属性,那么加载的时候,即便组是transient状态,也不会抛异常。因为采用了级联cascade属性,会首先保存Group,所以不抛异常。
2、cascade:指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作。
其属性值如下:
all:在所有的情况下都执行级联操作;
none:在所有情况下都不执行级联操作;
save-update:在保存和更新的时候执行级联操作;
delete:在删除的时候执行级联操作。