`

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

阅读更多

【SSH进阶之路】Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库。

【SSH进阶之路】Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识。

【SSH进阶之路】Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单。

【SSH进阶之路】Hibernate映射——多对一单向关联映射(四),我们介绍了多对一的关联映射,并详细了解说了,映射技巧,这篇我们依旧使用此映射技巧,帮助大家更好的理解。

 

下面开始今天的愉快之旅。

 

映射原理

 

两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。我们看一下这个例子的对象模型,如下图所示:

 

对象模型

 

从上图中可以看出:

1、一个人只有一张身份证,唯一的一个身份证号,对象之间是一对一的关系;

2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。

从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看下面的内容。

 

分类:

 

主键关联:

 

1、两个实体对象的主键一样,以表明它们之间的一一对应关系;

2、不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。

以上两点恰与唯一外键关联相反。

 

主键关联的关系模型

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的主键),也就是会生成外键约束语句
		 -->
		 <!-- idCard属性,表达的是本对象与IdCard的一对一关系。 -->
		<one-to-one name="idCard" class="IdCard"  constrained="true"></one-to-one>
	</class>
</hibernate-mapping>

生成的表结构以及测试数据:

 

唯一外键关联:

 

1、两个实体对象用一个外键来关联,以表表明对象之间的关系。

2、其实它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系

所以它采用多对一的标签来映射,如下所示:

<!-- 采用<mang-to-one>标签来映射,指定多的一端unique为true,
	这样就限制了多的一端的多重性为一,就是这样来映射的。
-->
<many-to-one name="" unique="true"></many-to-one>

唯一外键的关系模型

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>

生成的表结构以及测试数据:

 

其他相同代码如下:

Person

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

public class IdCard {
	private int id;
	private String cardNo;
	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;
	}
}

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>
	</class>
</hibernate-mapping>

建议

 

由于一对一主键关联映射具有以下两个缺点:

1、灵活性差,没有办法改成多对一关联映射,不能应变多变的需求;

2、必须先保存关联对象IdCard,之后才能保持Person;

所以,在映射一对一单向关联映射时,我们采用唯一外键关联映射。

 

下篇博文,我们介绍一对一双向关联映射,谢谢关注。

分享到:
评论

相关推荐

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...

    ssh框架.doc

    在多对一的单向关联中,一个Group可以被多个User引用,而User仅知道其所属的Group。在Hibernate映射文件中,我们可以通过`many-to-one`标签来表示这种关系。而在一对多的单向关联中,一个Group包含多个User,但User...

    ssh(struts、spring、hibernate)面试题

    3. **关系映射**:Hibernate支持一对一、一对多、多对一和多对多等各种关系映射,通过配置文件中的many-to-one、one-to-many、many-to-many等标签实现。 4. **缓存机制**:包括一级缓存(内部缓存)和二级缓存。一级...

    eshop1.0(ssh电子商城)

    ESho1.0版本主要实现项目的创建,数据库的创建与ORM映射. [创建项目与数据库] 1."电子商城系统"EShop应用项目的创建 ...12.配置订单到购物车的一对一单向关联关系 13.配置购物车到商品的多对多单向关联关系

    精通Java Web整合开发(第2版)

    12.4.5 多对一单向关联的annotation注解实现538 12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多...

    SSH框架面试题目及答案

    Hibernate支持多种关系映射,如一对一、一对多、多对一和多对多,通过配置文件中的`&lt;many-to-one&gt;`, `&lt;one-to-many&gt;`, `&lt;many-to-many&gt;`标签实现。 **四、Hibernate缓存机制** 1. 一级缓存(内部缓存):每个...

    SSH笔试题及答案

    优化 Hibernate 的方法包括使用双向一对多关联,不使用单向一对多、灵活使用单向一对多关联、不用一对一,用多对一取代、配置对象缓存,不使用集合缓存、一对多集合使用 Bag,多对多集合使用 Set、继承类使用显式...

    SSH的面试题,不错的哦

    - 避免单向一对多,使用双向一对多。 - 避免一对一,改用多对一。 - 合理配置缓存策略,如对象缓存而非集合缓存。 7. **Struts工作机制**: - Struts通过ActionServlet管理请求,从struts-config.xml读取配置,...

    SSH面试题大全.doc

    Hibernate支持四种关联关系:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many),这些关联关系允许对象模型和数据库模型之间的复杂映射。 4. Hibernate的缓存机制: ...

    hibernate中文帮助文档

    8. **一对多、多对一、一对一和多对多关系映射**:Hibernate支持四种主要的关联关系映射,包括单向和双向的关联,以及使用外键或代理键的实现方式。 9. **继承映射**:Hibernate支持类继承结构的映射,如单表继承、...

    ssh 框架整合总结

    例如,优化Hibernate的方法包括减少不必要的对象关联、避免使用单向一对多关联、合理配置缓存策略等。此外,`update()`和`saveOrUpdate()`的区别在于前者用于更新已存在的对象,而后者会尝试先保存,如果对象已经...

    JAVA_ssh面试题及答案

    SSH(Struts + Spring + Hibernate)是Java Web开发中常见的三大框架,它们各自承担着不同的职责,共同构建了一个高效、灵活的企业级应用程序架构。 **Hibernate工作原理及为什么使用** Hibernate是一个优秀的ORM...

    2010年最完整SSH面试题(Struts+Spring+Hibernate面试题问答23题,选择30题) 问答23题,选择30题(附答案)

    - 使用双向一对多关联,避免单向一对多,因为单向关联可能导致额外的数据库查询。 - 灵活使用单向一对多,避免不必要的双向关联。 - 避免一对一关系,改为多对一,以减少冗余。 - 配置对象缓存,而非集合缓存,...

    SSH笔试面试题, 面试官 最有可能问的哦!!!!

    - 避免单向一对多关联,使用双向一对多。 - 恰当地使用单向一对多。 - 用多对一替代一对一。 - 配置对象缓存,避免集合缓存。 - 选择合适的集合类型,如Bag用于一对多,Set用于多对多。 - 使用显式多态处理...

    ssh框架面试题

    - **优秀的ORM实现**:作为主流的持久化框架之一,Hibernate支持对象关系映射(ORM),可以更自然地管理数据模型。 - **提高开发效率**:Hibernate简化了DAO层的编码工作,使得开发者可以更加专注于业务逻辑的实现。...

    51CTO下载-ssh原理

    1. 避免单向一对多关联,使用双向关联。 2. 根据需求灵活运用单向一对多。 3. 尽可能使用多对一代替一对一。 4. 配置对象缓存,避免集合缓存。 5. 使用 Bag 表示一对多集合,Set 表示多对多集合。 6. 使用显式多态...

    java与ssh面试题总结

    SSH面试题涵盖了Java、...以上是对SSH面试题的详细解答,涵盖了Hibernate的核心概念、关联映射、缓存机制和查询方式,以及Struts的工作流程和Spring的框架优势。理解并掌握这些知识点对于Java Web开发者来说至关重要。

    SSH框架,详细版!

    - 支持多种关系映射,包括一对一、一对多、多对多等。 **延迟加载(Lazy Loading)**是Hibernate的一个重要特性,分为实体对象和集合的延迟加载。在数据未被实际使用前,不会加载到内存中,节省资源。 **类间关系...

    SSH面试题总结 开源框架

    对于Hibernate的优化,建议避免单向一对多关联,使用双向一对多;避免一对一关系,转而使用多对一;配置对象缓存,而非集合缓存。 接下来是Struts,它是一个MVC(模型-视图-控制器)框架。Struts的工作机制是在应用...

    SSH经典面试题目集合

    - **双向一对多关联**:避免使用单向一对多,因为单向一对多可能导致额外的数据库查询。 - **单向一对多关联的灵活使用**:在某些场景下,单向一对多可以提高性能。 - **用多对一取代一对一**:减少数据库表的数量和...

Global site tag (gtag.js) - Google Analytics