Hibernate(三)—一全面解析多对一关联映射

在开始讲述关联映射之前,先来介绍一下ORM的概念。ORM:Object Relational Mapping,对象关系映射。


ORM的系统主要实现对象到关系数据库的映射,然后开发人员可以通过操纵对象,进而间接的操纵数据库。


Hibernate框架实现ORM主要用到了:java实体(*.java)、映射文件(*.hbm.xml)和数据库的配置文件(hibernate.cfg.xml)三个文件。它们的作用如下:


Java实体类:它是有数据类型的数据存储的属性,并可以通过getter和setter方法访问这些属性。


映射文件:它是Java实体与数据库表的映射,包括实体与表的对应;实体属性、实体之间对应关系和数据库表字段的对应关系等。


数据库配置文件:它是指定与数据库连接时需要的连接信息,包括数据库类型、用户名和密码、连接字符串、实体类的映射地址等。


上文已经讲述,关联映射中一共有:一对多、一对一、多对一、多对多四种关联映射。今天先来看一对多关联映射。


多对一的映射原理是:在多的一端加入一个外键指向一的一端,如果维护了多指向一的关系,那么加载多的时候会吧一加载上来。


多对一的现象也是最多、最常见的。比如一个组里面可以有多个用户,而一个用户只能属于一个组。假如用多对一的映射来维护该关系,也就是说,每个用户只能属于一个组,存储的时候,只能在多的一端(用户端)加载组。



Hibernate(三)—一全面解析多对一关联映射_第1张图片

实体组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:在删除的时候执行级联操作。

你可能感兴趣的:(Hibernate,框架,数据库)