`

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

阅读更多

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

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

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

 

这篇博客,我们开始介绍基于基本映射的关联关系映射。

 

概念

 

基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用。

 

分类


 

关联关系分为上述七种,但是由于相互之间有各种关系,可以简化,例如:多对一与一对多映射,只是侧重的角度不对而已。

 

映射技巧

 

映射技巧是小编写映射文件的过程,总结的经典内容,总共分为四步,咋看不是特别易懂,但是效果很好。下面我们以实例看技巧。

 

(1)写注释

格式为:?属性,表达的是本对象与?的?关系。

解释:在写映射文件之前先写注释,将问号的地方填上相应的内容。例如:<!-- group属性,表达的是本对象(User)与Group的多对一的关系-->

 

(2)写映射的框架(拷模版)

 

多对一

<many-to-one name=“” class=“” column=“”/>

一对多

Set

<set name="">

<key column=""></key>

<one-to-many class=""/>

</set>

多对多

Set

<set name="" table="">

<key column=""></key>

<many-to-many class="" column=""/>

</set>

 

 

(3)填空

填空,就是将映射的框架信息,填写完成,完成映射文件。

• name属性:属性名(注释中的第1问号)
• class属性:关联的实体类型(注释中的第2个问号)
• column属性:
○ <many-to-one column="..">:一般可以写成属性名加Id后缀,如属性为group,则column值写成groupId。
○ 一对多中的<key column="..">:从关联的对方(对方是多对一)映射中把column值拷贝过来。
○ 多对多中的<key column=“..”>:一般可以写成本对象的名加Id后缀,如本对象名为User,则写为userId。
○ 多对多中的<many-to-many column=“..”>:一般可以写为关联对象的名称加Id后缀。

(4)完成

将映射文件添加到hibernate.hbm.xml中,这个相信大家都知道为什么。

 

我们后面所有关联映射的博文都使用此映射技巧来写映射文件,明白之后,速度会非常快。

 

多对一关联映射

映射原理

 

多的一端维护关联关系,在“多”的一端加入一个外键,指向“一”的一端。多的一端持有一的一端的引用,即在“多”的一端加外键,指向“一”的一端。

 

实例

 

比如,多个用户属于同一组,我们从对象模型和关系模型两个角度来分析一下这个例子,如下:

从上图可以看出,对象模型具有方向性,通过用户(User)可以看到组(Group),但是不能反过来。用户和组各对应一张数据库表,聚合关系需要一个外键(groupid)来表示,最后生成的表如下所示:

 

作用:

当我拿到用户时直接就可以拿到用户的组,hibernate在访问多的一端时,可以自动的加载关联对象。对于用户(User)来说,它的关联对象是组(group)。

 

上面都是多对一关联映射的基本原理,以及相应的实例,下面我们看一下代码:

 

代码

User类

public class User {
	private int id;
	private String name;
	private Group group;
		
	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 getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
}

Group类

public class Group {
	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 package="com.liang.hibernate">
	<class name="User" table="t_user">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name"></property>
		<!-- group属性,表达的是本对象与Group的多对一的关系-->
		<many-to-one name="group" class="Group" column="groupid"></many-to-one>
		<!-- 解释:
			多对一关系标签:
			<many-to-one name=“” class=“” column=“”/>
			
			1、第1个问号:group是User类的属性,对应于name属性名
			2、第2个问号:class表达的是本对象(User)与Group的关系
			3、第3个问号:column是属性名+Id
			当我们写完注释之后,我们直接拷贝问号的对应关系即可。
		 -->
	</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"></generator>
		</id>
		<property name="name"></property>
	</class>
</hibernate-mapping>

 

生成的表结构,与上面的分析的关系模型一样:

 

项目中,多对一关联映射是最常见的映射,但它Hibernate的关联映射中最简单的一种映射关系。下篇博文,我们介绍一对一单向关联映射,谢谢关注。

 

分享到:
评论

相关推荐

    eshop1.0(ssh电子商城)

    6.配置商品到商品分类的多对一单向关联关系 7.配置会员到会员级别的多对一单向关联关系 8.配置会员到订单的一对多双向关联关系 9.配置会员到留言的一对多单向关联关系 10.配置管理员到留言的一对多单向关联关系 11....

    ssh框架.doc

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

    精通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(struts、spring、hibernate)面试题

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

    SSH笔试题及答案

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

    SSH框架面试题目及答案

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

    SSH面试题大全.doc

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

    hibernate中文帮助文档

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

    ssh 框架整合总结

    在处理一对多或多对多关联时,Hibernate可能会出现N+1查询问题。当从一个实体加载关联集合时,除了初始查询外,还会对每个关联项单独发起查询,导致性能下降。解决这个问题的一种常见方法是使用HQL或Criteria查询时...

    SSH的面试题,不错的哦

    - 主要有四种:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many)。 4. **Hibernate缓存机制**: - 一级缓存:每个Session内部的缓存,随Session关闭而清除。 - 二...

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

    - 避免一对一关系,改为多对一,以减少冗余。 - 配置对象缓存,而非集合缓存,因为集合缓存可能导致数据一致性问题。 - 使用Bag(List)代表一对多关系,Set代表多对多关系,以确保唯一性。 - 使用显式多态处理...

    java与ssh面试题总结

    Hibernate支持四种关联关系:一对一(one-to-one)、一对多(one-to-many)、多对一(many-to-one)和多对多(many-to-many)。 4. **Hibernate的缓存机制**: Hibernate有一级缓存和二级缓存。一级缓存是每个...

    SSH面试题总结 开源框架

    在Hibernate中,存在四种类之间的关联关系:一对一(one-to-one)、一对多(one-to-many)、多对多(many-to-many)和多对一(many-to-one)。这些关系映射为对象间的导航属性,允许对象间建立关联。 Hibernate的...

    JAVA_ssh面试题及答案

    - 避免一对一,改用多对一。 - 配置对象缓存,减少集合缓存。 - 一对多集合使用Bag,多对多集合使用Set。 - 显式多态处理继承类。 - 减少表字段,增加表关联,利用二级缓存优化。 **Struts的工作机制及为什么使用**...

    51CTO下载-ssh原理

    5. 关系映射:支持一对一、一对多、多对多等各种关系映射,便于处理复杂的数据库结构。 Hibernate 的延迟加载(Lazy Loading)允许对象在实际需要时才从数据库加载,提高性能。例如,实体对象和集合可以通过配置...

    ssh框架面试题

    - **用多对一取代一对一**:可以减少不必要的关联。 - **配置对象缓存**:避免使用集合缓存。 - **使用Bag或Set**:根据不同情况选择合适的集合类型。 - **使用显式多态**:对于继承类来说,使用显式多态可以提高...

    SSH框架,详细版!

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

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

    - **类间关系**:通过配置文件中的映射注解实现一对一、一对多、多对多等关系。 - **缓存机制**:包括一级缓存(Session级别的事务级缓存)和二级缓存(可选的进程或分布式缓存,如Ehcache)。 2. **Hibernate...

    SSH面试题 java SSH面试题

    Hibernate支持多种关系映射,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系可以通过配置文件中的注解或XML元素定义。 **Hibernate的缓存机制** 1. **一级缓存*...

Global site tag (gtag.js) - Google Analytics