上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息。如图所示:
关键原因在于对象模型具有方向性:
单向:一端只能加载另一端,不能反过来。
双向:两端都可以加载另一端。
问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢?
下面我们开始介绍一对一的双向关联映射。
映射原理
双向关联映射与单向关联映射的原理是一样的,双向关联映射并不影响存储,只影响加载。所以,双向关联映射和单向关联映射的关系模型是一样的即数据库的表结构是一样的,只是IdCard的实体类和配置文件(IdCard.hbm.xml)发生了一点点变化。
对象模型
从上图中可以看出:
1、一个人只有一张身份证,唯一的一个身份证号,对象之间是一对一的关系;
2、两个对象得关系维护还是由person端决定(因为关系只能由一端维护主键,否则关系就乱了)。
根据上面的对象模型,我们可以看到Person端没有变化,但是要在IdCard端加上Person的引用,例如Person和IdCard实体类如下。
Person
package com.liang.hibernate; public class Person { private int id; private String name; private IdCard idCard; public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } 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; } }
IdCard
package com.liang.hibernate; public class IdCard { private int id; private String cardNo; private Person person; public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCardNo() { return cardNo; } public void setCardNo(String cardNo) { this.cardNo = cardNo; } }
无论是单向关联映射还是双向关联映射,他们都属于一对一关联映射,只是他们主键的生成策略不同,分为主键关联映射和唯一外键关联映射。
由于它们都属于一对一关联映射,所以,Hibernate封装双向关联映射时,主键关键映射和唯一外键关联映射的加载策略一样,都采用的是一对一<one-to-one name=""></one-to-one>,只是属性设置不一致,所以,下面我们分开来看IdCard的配置文件。
分类:
主键关联映射
同一对一单向关联映射类似,主键关联即利用主键进行关联,关联主键的值相同。下面我们看一下映射文件:
IdCard.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="IdCard" table="t_idCard"> <id name="id"> <generator class="native"></generator> </id> <property name="cardNo"></property> <!-- 怎么加载对象,抓取策略:join联合查询(默认),select:一条条的查询 --> <one-to-one name="person" class="Person" fetch="join"></one-to-one> </class> </hibernate-mapping>
Person.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="Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,forgeign会取得关联对象的标识 --> <generator class="foreign" > <param name="property">idCard</param> </generator> </id> <property name="name"></property> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained="true"表示,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one> </class> </hibernate-mapping>
生成的表结构
唯一外键关联映射
一对一双向关联映射的外键关联映射也与一对一单向关联映射的外键关联映射类似,在其一对一的指向端(Person)存在一个唯一外键,该唯一外键与被指向端(IdCard)相关联,关联主键的值相同。下面我们看一下映射文件:
IdCard.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="IdCard" table="t_idCard"> <id name="id"> <generator class="native"></generator> </id> <property name="cardNo"></property> <!-- 一对一唯一外键关联双向采用<one-to-one>标签来映射,必须指定<one-to-one> 标签中的property-ref属性为关系字段的名称 --> <one-to-one name="person" class="Person" property-ref="idCard"></one-to-one> </class> </hibernate-mapping>
Person.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="Person" table="t_person"> <id name="id"> <generator class="native" ></generator> </id> <property name="name"></property> <!-- 由于它是一对一的唯一外键关联,它是多对一关联的特例,注释可以直接写成多对一关联--> <!-- idCard属性,表达的是本对象与IdCard的多对一关系。 --> <many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one> </class> </hibernate-mapping>
生成的表结构
对比
一对一单向和双向关联映射的区别正是对象模型和关系模型的区别之一。
对象模型:有方向性。它到底是单向还是双向是由对象模型决定的即配置文件决定。
关系模型:没有方向性或者说是双向的。从任何一端都可以加载另一端。
下载
以上内容,只证明了一对一双向关联映射不影响存储即没有改变表结构,但不能证明关联是双向的,需要写相应的测试用例,我们以源码的形式给大家。源码下载
总结
一对一双向关联映射并不是必须的,是由需求下决定的。如果没有这样的需求,用户也没有要求,系统也不需要,就没有必要建立双向的关联映射。
下篇博文,我们介绍多对多单向关联映射,谢谢关注。
相关推荐
总之,Hibernate的关联映射是其强大之处,能够帮助开发者轻松处理复杂的数据库关系。SSH框架结合了MVC设计模式、依赖注入和持久化管理,为Java Web开发提供了一套完整的解决方案。通过深入学习和实践,我们可以更好...
本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...
SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中的一个经典组合。这个框架集合了Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)功能,Struts的MVC(Model-View-Controller...
总的来说,SSH一对多(两表双向关联查询)涉及到的主要知识点包括:数据库设计、Hibernate的关联映射、SSH框架的整合、以及单元测试。在实际开发中,理解并熟练掌握这些内容能够帮助我们高效地进行数据操作和业务...
在Java世界中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。SSH是Spring、Struts和Hibernate三个开源框架的简称,常被用于构建...
本笔记将详细介绍SSH映射文件配置的三个核心部分:基础配置参数使用、多对一映射以及一对多映射。 **基础配置参数使用** SSH的基础配置通常位于`~/.ssh/config`文件中,此文件可以定义不同的主机别名和相关设置。...
Hibernate是一个强大的ORM框架,它消除了传统的JDBC繁琐的代码,提供了对数据库操作的面向对象的封装。通过Hibernate,开发者可以定义Java类来代表数据库表,类的属性对应表的列,类的对象则代表表的行。Hibernate...
"多对一"关系映射是Hibernate支持的四种基本关联类型之一,包括一对一、一对多、多对一和多对多。本篇将深入探讨“多对一”关系映射的概念、配置以及在实际web系统中的应用。 **一、“多对一”关系映射概念** 在...
本主题聚焦于SSH框架中的“多对多”关联映射,这是一种数据库设计模式,允许一个实体与多个其他实体相互关联。下面将深入探讨这一关键概念及其在SSH框架下的实现。 首先,让我们理解“多对多”关联。在关系数据库中...
以下是对Hibernate 5在SSH框架中的一些关键知识点的详细说明: 1. **实体管理**:Hibernate 5通过Entity Manager API管理数据库实体。实体类代表数据库中的表,通过注解或XML配置文件定义其与数据库表的映射关系。 ...
SSH2(Struts2、Spring、Hibernate2)是Java Web开发中的一个经典组合,它集成了MVC框架Struts2、依赖注入框架Spring以及对象关系映射框架Hibernate3.3,为开发者提供了一套高效、灵活的开发环境。在这个"SSH2整合之...
SSH整合是Java Web开发中的一种常见模式,它结合了Spring框架、Struts2框架和Hibernate持久化框架,以实现高效、灵活的业务逻辑处理和数据管理。以下将详细阐述SSH整合涉及的关键知识点。 1. Spring框架:Spring是...
SSH之Hibernate总结 SSH(Struts、Spring、Hibernate)是Java Web开发中常见的三大框架,而Hibernate作为ORM(对象关系映射)框架,是连接Java应用程序与数据库的关键组件。本总结将围绕Hibernate的核心概念、配置...
- **一对一、一对多、多对一、多对多关联映射**:通过`one-to-one`、`one-to-many`、`many-to-one`和`many-to-many`标签定义不同类型的关联关系。 在SSH整合中,Spring框架扮演着管理角色,它可以通过依赖注入...
SSH(Struts2、Hibernate、Spring)是一个经典的Java Web开发框架组合,用于构建高效、可维护的Web应用程序。在这个Maven项目中,这三个框架与Maven构建工具一起使用,以实现更好的依赖管理和项目构建流程。下面将详细...
SSH,即Spring、SpringMVC和Hibernate,是Java开发中常用的一个技术栈,主要用于构建企业级Web应用程序。这个技术组合提供了完整的数据访问、业务逻辑、控制层和视图层的解决方案,大大简化了开发过程。 **Spring...
SSH集成是Java开发中一种常见的框架整合方式,它包含了Spring、Struts和Hibernate这三个开源框架。这三者分别负责不同的职责:Spring作为整体的应用管理框架,Struts处理MVC(模型-视图-控制器)架构,而Hibernate则...
SSH(Struts、Spring、Hibernate)是Java Web开发中常用的一种技术栈,其中Hibernate是一个强大的对象关系映射(ORM)框架。这篇文档将详细介绍Hibernate在应用开发中的基础使用,帮助初学者快速入门。 **SSH框架...
SSH是Spring、Struts和Hibernate三个开源框架的首字母缩写,它们分别负责应用的依赖注入、MVC模式实现以及对象关系映射。这里我们将深入探讨SSH框架的自动搭建与手动搭建。 首先,让我们了解SSH框架的核心组件: 1...