`

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

阅读更多

上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息。

上篇博文【SSH进阶之路】Hibernate映射——一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载。下面我们开始今天的内容:

 

一对多关联映射

 

映射原理

 

一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。

 

多对一和一对多的区别

 

多对一和一对多的区别在于维护的关系不同

(1)多对一:多端维护一端的关系,在加载多端时,可以将一端加载上来。

(2)一对多:一端维护多端的关系,在加载一端时,可以将多端加载上来。

 

分类

 

一对多单向关联映射

 

对象模型

从对象模型中,我们可以看出,Group持有User的一个引用。由于是单向关联,所以数据在加载Group时,会把User加载上来,但是User并不知道Group的存在。

 

我们先看一下Group和User的实体,以及映射文件。

Group

package com.liang.hibernate;
import java.util.Set;
public class Group {
	private int id;
	private String name;
	private Set users;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set getUsers() {
		return users;
	}
	public void setUsers(Set users) {
		this.users = users;
	}
}

User

package com.liang.hibernate;

public class User {
	private int id;
	private String name;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

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.liang.hibernate.User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

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.liang.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- users属性,表达的是本对象与User的一对多的关系 -->
		<set name="users">
             <!--当前表(Group)的主键-->
			<key column="groupid"/>
			<one-to-many class="com.liang.hibernate.User"/>
		</set>
	</class>
</hibernate-mapping>

生成的表结构和测试数据

缺点

 

1)因为多端User不知道Group的存在(也就是User不维护与Group的关系),所以在保存User时,关系字段groupId为null,如果该字段设置为非空,则将无法保存数据。

2)因为User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证Group和User有关系,这样加载Group时才把该Users对应的用户加载上来。

 

一对多双向关联映射

 

对象模型

双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。

 

我们看一下Group和User的实体,映射文件

Group

package com.liang.hibernate;

import java.util.Set;

public class Group {
	private int id;
	private String name;
	private Set users;

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set getUsers() {
		return users;
	}
	public void setUsers(Set users) {
		this.users = users;
	}
}

User

package com.liang.hibernate;

public class User {
	private int id;
	private String name;
	private Group groups;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Group getGroups() {
		return groups;
	}
	public void setGroups(Group groups) {
		this.groups = groups;
	}
}

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 package="com.liang.hibernate">
	<class name="Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- 影响控制反转:inverse="false",多的一端维护关系,让一的一端失效 -->
		<set name="users" inverse="true">
			<key column="groupid" not-null="true"/>
			<one-to-many class="User"/>
		</set>
	</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 package="com.liang.hibernate">
	<class name="User" table="t_user">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<!-- groups属性,表达的是本对象与Group的多对一的关系 -->
		<many-to-one name="groups" class="Group" column="groupid"/>
	</class>
</hibernate-mapping>

生成的表和测试数据

 

一对多双向关联的映射方式:
1)在一的一端的集合上采用<key>标签,在多的一端加入一个外键
2)在多的一端采用<many-to-one>标签

注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱。

inverse属性:

inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端维护关系,如果inversetrue,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inversetrue。

注意:inverse属性,只影响数据的存储,也就是持久化。

 

目的

 

一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。

 

总结

 

一对多关联映射还是很简单的,下篇博文我们介绍多对多关联映射。谢谢关注。

分享到:
评论

相关推荐

    hibernate关联映射详解SSH 多对多,一对多关系对象映射

    本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    多对多的关联映射--基于SSH开发

    本主题聚焦于SSH框架中的“多对多”关联映射,这是一种数据库设计模式,允许一个实体与多个其他实体相互关联。下面将深入探讨这一关键概念及其在SSH框架下的实现。 首先,让我们理解“多对多”关联。在关系数据库中...

    SSH框架中构建hibernate必须的包

    SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中的一个经典组合。这个框架集合了Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)功能,Struts的MVC(Model-View-Controller...

    SSH笔记-映射文件配置

    本笔记将详细介绍SSH映射文件配置的三个核心部分:基础配置参数使用、多对一映射以及一对多映射。 **基础配置参数使用** SSH的基础配置通常位于`~/.ssh/config`文件中,此文件可以定义不同的主机别名和相关设置。...

    Hibernate映射配置详解

    在Java世界中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。SSH是Spring、Struts和Hibernate三个开源框架的简称,常被用于构建...

    SSH一对多(两表双向关联查询)

    总的来说,SSH一对多(两表双向关联查询)涉及到的主要知识点包括:数据库设计、Hibernate的关联映射、SSH框架的整合、以及单元测试。在实际开发中,理解并熟练掌握这些内容能够帮助我们高效地进行数据操作和业务...

    Hibernate关系映射

    "多对一"关系映射是Hibernate支持的四种基本关联类型之一,包括一对一、一对多、多对一和多对多。本篇将深入探讨“多对一”关系映射的概念、配置以及在实际web系统中的应用。 **一、“多对一”关系映射概念** 在...

    hibernate_____实现ssh2用的hibernate

    Hibernate是一个强大的ORM框架,它消除了传统的JDBC繁琐的代码,提供了对数据库操作的面向对象的封装。通过Hibernate,开发者可以定义Java类来代表数据库表,类的属性对应表的列,类的对象则代表表的行。Hibernate...

    ssh框架中的hibernate5

    以下是对Hibernate 5在SSH框架中的一些关键知识点的详细说明: 1. **实体管理**:Hibernate 5通过Entity Manager API管理数据库实体。实体类代表数据库中的表,通过注解或XML配置文件定义其与数据库表的映射关系。 ...

    SSH框架整合中hibernate框架所需要的配置文件

    - **一对一、一对多、多对一、多对多关联映射**:通过`one-to-one`、`one-to-many`、`many-to-one`和`many-to-many`标签定义不同类型的关联关系。 在SSH整合中,Spring框架扮演着管理角色,它可以通过依赖注入...

    SSH之Hibernate总结

    这包括一对一、一对多、多对一、多对多等各种关系的映射,以及懒加载、级联操作等特性。 9. Hibernate查询(HQL) HQL(Hibernate Query Language)是Hibernate提供的面向对象的查询语言,类似于SQL,但更接近于...

    ssh(sevrlet+spring+hibernate)整合所需jar包

    SSH整合是Java Web开发中的一种常见模式,它结合了Spring框架、Struts2框架和Hibernate持久化框架,以实现高效、灵活的业务逻辑处理和数据管理。以下将详细阐述SSH整合涉及的关键知识点。 1. Spring框架:Spring是...

    SSH2整合之hibernate3.3 jar包

    SSH2(Struts2、Spring、Hibernate2)是Java Web开发中的一个经典组合,它集成了MVC框架Struts2、依赖注入框架Spring以及对象关系映射框架Hibernate3.3,为开发者提供了一套高效、灵活的开发环境。在这个"SSH2整合之...

    ssh全注解项目(一对一,一对多,多对多)

    对于一对一、一对多和多对多的关系映射,Hibernate提供了`@OneToOne`、`@OneToMany`、`@ManyToOne`和`@ManyToMany`注解。比如: - `@OneToOne`用于建立一对一关系,可以使用`@JoinColumn`来指定外键所在的列。 - `@...

    hibernate 映射关系

    在Hibernate中,映射关系是其核心功能之一,它定义了对象与数据库表之间的对应规则,包括一对一、一对多、多对一和多对多四种主要关系。接下来,我们将深入探讨这些映射关系。 一对一(OneToOne)关系: 在数据库...

    SSH增删改查一对多+分页

    综上所述,"SSH增删改查一对多+分页"项目展示了如何综合运用Struts2、Spring和Hibernate框架,结合Oracle数据库,实现一个完整的Web应用,包括数据的增删改查操作、一对多关联关系处理以及前端的分页展示。...

    Maven项目ssh Struts2+hibernate+Spring+maven框架.zip

    SSH(Struts2、Hibernate、Spring)是一个经典的Java Web开发框架组合,用于构建高效、可维护的Web应用程序。在这个Maven项目中,这三个框架与Maven构建工具一起使用,以实现更好的依赖管理和项目构建流程。下面将详细...

    ssh整合的一对多的例子(带数据库的)

    在一对多关系中,一个实体可以关联多个其他实体,比如一个用户可以拥有多个订单,Hibernate通过配置文件或注解来定义这种关系,并自动处理相关的CRUD(创建、读取、更新、删除)操作。 在SSH整合的一对多例子中,...

Global site tag (gtag.js) - Google Analytics