`

多对一映射

阅读更多

多对一:

这里举例:User类与Group类,

一个Group中是有多个User的。具体数据库表现为在Group类的主键作为User类的外键。

POJO:

package com.lwf.hibernate.pojo;

public class User {

	private int id;
	private String name;
	private Group group = new 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;
	}
}

 

package com.lwf.hibernate.pojo;

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;
	}
}

 

<?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.lwf.hibernate.pojo">
	
		<class name="User" table="t_user">
			<id name="id">
				<generator class="native"></generator>
			</id>
			<property name="name"></property>
			<many-to-one name="group" column="group_id" cascade="all" ></many-to-one>
		</class>
		<class name="Group" table="t_group">
		
			<id name="id">
				<generator class="native"></generator>
			</id>
			<property name="name"></property>
		</class>
		
	</hibernate-mapping>

 

测试类:

package com.lwf.hibernate.test;

import junit.framework.TestCase;

import org.hibernate.Session;

import com.lwf.hibernate.pojo.Group;
import com.lwf.hibernate.pojo.User;
import com.lwf.hibernate.util.HibernateUtil;

public class Many2one_Test extends TestCase{

	public void testUser(){
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		try{
			Group g = new Group();
			g.setName("group1");
			//session.save(g);
			//如果不保存group那么<many-to-one name="group" column="group_id" cascade="all" />中的cascade="all" 必须设置.
			for (int i = 0; i < 5; i++) {
				User u = new User();
				u.setName("user");
				u.setGroup(g);
				session.save(u);
			}
			
			
			HibernateUtil.commit(session);
		}catch(Exception e){
			HibernateUtil.roolback(session);
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
	public void testLoad(){
		
		Session session = null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			User user = (User)session.load(User.class, 1);
			System.out.println(user.getName());
			System.out.println(user.getGroup().getName());
			
			HibernateUtil.commit(session);
		}catch(Exception e){
			HibernateUtil.roolback(session);
		}finally{
			HibernateUtil.closeSession(session);
		}
		
	}
	
}

 

注意点:

一、了解cascade="all"的使用.如果设置了级联,那么保存User的时候会自动先保存Group。否则如果不调用session.save(g);会报错。

二、观察testLoad方法,我们发现发出了如下SQL语句:

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.group_id as group3_0_0_ from t_user user0_ where user0_.id=?
user
Hibernate: select group0_.id as id1_0_, group0_.name as name1_0_ from t_group group0_ where group0_.id=?
group1

 

即发出了两条SQL,先查出user的group_id,然后再通过group_id到group对象查询name

那么我们知道在数据库操作上是可以通过连接来查询出的:

mysql> select u.name,g.name from t_user u left outer join t_group g on u.group_id=g.i
d;

 那么其实我们在many-to-one上增加fetch属性即可实现这个查询

如下:

<many-to-one name="group" column="group_id" cascade="all" fetch="join" ></many-to-one>

 

再来测试一下,这时通过testLoad方法发出的SQL语句是:

Hibernate: select user0_.id as id0_1_, user0_.name as name0_1_, user0_.group_id as group3_0_1_, group1_.id as id1_0_, group1_.name as name1_0_ from t_user user0_ left outer join t_group group1_ on user0_.group_id=group1_.id where user0_.id=?
user
group1

 

分享到:
评论

相关推荐

    hibernate 多对一映射关联配置

    本文将深入探讨Hibernate中的多对一映射关联配置,并结合具体的文档心得进行讲解。 首先,我们要了解多对一映射的基本概念。在数据库设计中,如果一个表(实体A)的某一列是另一个表(实体B)的主键,那么就存在...

    Hibernate之关联关系映射(一对多和多对一映射,多对多映射).docx

    1. 一对多与多对一映射: 在现实世界中,许多关系表现为一对多或多对一的形式。例如,一个老师可以教授多个学生,而一个学生只能被一个老师教导;同样,一个部门可以包含多个员工,但每个员工只属于一个部门。在...

    一对多映射(双向映射)源码

    在Java或其他编程语言中,一对多映射(也称为多对一映射)和双向映射是两个重要的概念,它们在设计模式、数据库关系映射以及数据结构实现等方面有广泛应用。 一对多映射是指一个键可以对应多个值,而每个值只能对应...

    hibernate 一对多多对一的映射

    通过学习和实践Hibernate的一对多和多对一映射,你可以更高效地管理数据库中的复杂关系,使得数据操作更加便捷。在实际项目中,根据业务需求灵活运用这些映射策略,可以极大地提高开发效率和代码的可维护性。

    ibatis 一对多 多对多完整映射

    本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析和工具使用技巧。 **一对多关系映射** 在数据库设计中,一对多关系是指一个父记录可以与多个子记录关联,例如,一个用户可以有多...

    hibernate 映射关系学习入门 一对一映射

    本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    MyBatis一对多映射

    一对多映射指的是一个父类实体对应多个子类实体的关系,例如一个学生可以有多个课程,一个部门可以有多名员工等。 一、一对多映射的基本概念 在数据库中,如果一个表的记录(主表)与另一个表的记录(从表)之间...

    Ibatis一对一映射提示

    本篇将深入讲解iBATIS一对一映射的概念、配置及应用,帮助你更好地理解和运用这个功能。 一对一映射在数据库设计中是指两个表之间存在一对一的关系,例如,一个员工可能只有一个部门,一个部门也只对应一个员工。在...

    7 映射-- 多对一(员工对部门)

    标签中的“工具”可能指的是使用诸如MyEclipse、IntelliJ IDEA等集成开发环境的Hibernate插件,这些工具能自动生成映射文件或注解,简化开发过程,帮助开发者更好地理解和管理多对一映射。 总结,多对一的映射是...

    ibatis 一对多关系映射

    首先,我们需要在映射文件中定义主表(一对一端)和从表(多对一端)的映射。假设我们有一个`User`类对应`users`表,一个`Order`类对应`orders`表,其中`orders`表有一个`user_id`字段作为外键关联到`users`表。 在...

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

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

    Hibernate高级映射实例

    2. **单向多对一映射**: 这种关系中,多个实例可以引用同一个实例,比如员工与部门的关系。在实体类中,我们通过@ManyToOne注解指定多的一方与一的一方的关系,并通过@JoinColumn指定引用的列名。 3. **单向一对...

    SSH笔记-映射文件配置

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

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    Hibernate 注解映射

    * 多对一映射:使用 @ManyToOne 和 @JoinColumn 注解,指定关联列。 * 一对多映射:使用 @OneToMany 注解,默认会使用连接表做一对多的关联。添加 @JoinColumn 注解后,就会使用外键关联,而不使用连接表。 * 双向一...

    MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    在本篇关于MyBatis框架的学习中,我们将深入探讨一对一关联映射和一对多关联映射的概念、配置以及在实际开发中的应用。MyBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,从而...

    hibernate的多种映射关系

    3. **多对一映射 (Many-to-One)** 多对一与一对多是相反的关系,即多个实体可以与单个实体关联。这在 Java 类中通过在子类使用 `@ManyToOne` 注解,而在父类使用 `@OneToMany` 实现。通常,多对一的外键是在子类...

Global site tag (gtag.js) - Google Analytics