`

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

阅读更多

 多对一的例子 , 多个员工 对 一个部门  (Hibernate3.2)

 

package dao.po;
/**
 * @author zl 员工类
 */
public class Employee
{
 private int   id; // 员工的ID 
 private String  name; // 员工的名称
 private Department depart;    //员工所在部门, 是多对一关系
}

 

package dao.po;
/**

 * 部门类
 * 
 * @author zl
 * 
 */
public class Department
{
	private int		id;	//部门的ID 
	private String	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="dao.po">
	<class name="Employee">	
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" not-null="true" length="255" column="`name`"/>
		<!-- 这里做多对一映射    -->
		<!-- name="depart"是Employee类的属性名 -->
		<!-- column="depart_id" 是表中字段名 -->
		<!-- 注意:下面没有非空 约束 , 很多情况,外键是有非空约束的, 一会后面说-->
		<!--column="depart_id" 中的depart_id是Employee对象的depart属性映射为Employee表中的depart_id字段-->
		<many-to-one name="depart" column="depart_id" ></many-to-one>
	</class>
</hibernate-mapping>

 

<?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="dao.po">
	<class name="Department">	
		<id name="id">
			<generator class="native"/>
		</id>		
		<property name="name" not-null="true" length="255" column="`name`"/>

</class>
</hibernate-mapping>

 hibernate.cfg.xml 文件实在没什么好说的,就不显示了, 想看的下载附件.

 

 

我们来保存员工 和 部门:

package dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import dao.po.Department;
import dao.po.Employee;


/**
 * 多对一的例子 , 多个员工 对 一个部门
 * 
 */

public class Many2One

{
	/**
	 * @param args
	 */
	public static void main(final String[] args)
	{
	add(); //添加两个员工, 一个部门
	}
	/**
	 * 添加两个员工, 一个部门
	 */
	public static void add()
	{
		final Department depart = new Department(); //部门
		depart.setName("技术部");
		final Employee em1 = new Employee(); //员工 一
		em1.setName("赵磊");
		em1.setDepart(depart);

		final Employee em2 = new Employee(); //员工 二
		em2.setName("陈加俊");
	em2.setDepart(depart);
		Session session = null;
		try
		{
			session = HibernateUtil.getSeesion();
			final Transaction tx = session.beginTransaction();
			session.save(depart); //先插入部门
		session.save(em1); //后插入员工, 因为员工的外键是 部门
			session.save(em2);
			tx.commit();
		}
		finally
		{
			if (session != null)
			{
				session.close();

			}
		}
	}
}

 注意:保存的顺序:

 

第一种:

            session.save(depart); //先插入部门
            session.save(em1); //后插入员工, 因为员工的外键是 部门
            session.save(em2);

输出的SQL:

            Hibernate: insert into Department (`name`) values (?)
            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)
            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)

第二种:

            session.save(em1); //先插入员工
            session.save(em2);
            session.save(depart); //后插入部门

输出的SQL:

            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)
            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)
            Hibernate: insert into Department (`name`) values (?)
            Hibernate: update Employee set `name`=?, depart_id=? where id=?
            Hibernate: update Employee set `name`=?, depart_id=? where id=?

 

            这里多了两句 update,要 注意.

 

如果Employee.hbm.xml 中外键有非空约束 ,如下:保存时只能用"第一种 "顺序.  用了第二种,先插入员工,但depart_id字段为空,会异常,不能插入.

 

<many-to-one name="depart" column="depart_id" not-null="true"></many-to-one>

 

 

 

我们来查询一个员工, 注意"部门":

 

/**
	 * 测试查询
	 * 
	 * @param args
	 */
	public static void main(final String[] args)
	{
		//add(); //添加两个员工, 一个部门
		final Employee em = query(7);
		//员工的部门 , 执行Hibernate.initialize()后, 在session关闭前就取得了部门.
		//若没有执行Hibernate.initialize(), 下面会抛异常.
		System.out.println(em.getDepart().getName());
}

	/**
	 * 查询一个员工出来
           */
	public static Employee query(final int id)
	{
		Session session = null;
		try
		{
			session = HibernateUtil.getSeesion();
			final Transaction tx = session.beginTransaction();
			final Employee em = (Employee) session.get(Employee.class, id); //按ID查
			//因为 员工的 "部门" 属性会懒加载,
			//在session关闭后,调用em.getDepart()无法取到部门信息
			//所以这里用 Hibernate.initialize(em.getDepart()) 提前加载一下.
			//是em.getDepart() 而不是em.
			Hibernate.initialize(em.getDepart());
			tx.commit();
		return em;
		}
	finally
		{	if (session != null)
			{
			session.close();
			}
	}

}

 

输出的SQL是:

Hibernate: select employee0_.id as id1_0_, employee0_.`name` as name2_1_0_, employee0_.depart_id as depart3_1_0_ from Employee employee0_ where employee0_.id=?

 

Hibernate: select department0_.id as id0_0_, department0_.`name` as name2_0_0_ from Department department0_ where department0_.id=?

 

做了两次查询, 没有使用 join on ,  想使用join on 还要配置. 默认不用.

 

关于懒加载,  会在以后的文章中专门讲, 这里先不讲, 只是用了用 Hibernate.initialize(em.getDepart()) 提前加载

 

 

分享到:
评论
1 楼 明天的昨天 2010-03-15  
public static Employee query(final int id)
查询方法中应该不涉及事务吧

相关推荐

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

    标题中的“8 映射-- 一对多(部门对员工)”指的是在数据库设计和对象关系映射(ORM)中常见的关系类型,特别是使用Hibernate框架时的处理方式。在这个场景中,“部门”与“员工”之间存在一对多的关系,即一个部门...

    Spring+Hibernate一对多关联映射---部门与员工表的级联添加

    本教程将深入探讨Spring和Hibernate结合使用时的一对多关联映射,特别是部门与员工表的级联添加。 在数据库设计中,一对多关联是一个常见的关系类型,例如一个部门可以有多名员工,但每个员工只能属于一个部门。在...

    MyBatis高级映射(一对多查询)

    在数据库关系模型中,一对多关系是常见的关联类型,例如一个学生可以对应多个课程,一个部门可以有多个员工等。MyBatis提供了一对多映射功能,使得在Java对象中可以直接获取到这种关联关系的数据。 1. **配置一对多...

    ibatis 一对多关系映射

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

    Ibatis一对一映射提示

    一对一映射在数据库设计中是指两个表之间存在一对一的关系,例如,一个员工可能只有一个部门,一个部门也只对应一个员工。在iBATIS中,这种关系可以通过配置XML映射文件或者注解来实现。 **一对一映射的基本概念:*...

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

    2. **多对一关联**:例如,每个员工属于一个部门,可以创建一个Department类(对应Department表)和Employee类。Employee类有一个Department对象的引用,表示员工属于一个部门,而部门可以有多个员工。 3. **多对多...

    MyBatis一对多映射

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

    Hibernate持久化映射一对多和多对一

    多对一映射表示多个实体(如员工)可以关联一个实体(如部门)。在数据库层面,这表现为多个表(员工表)的记录关联同一个表(部门表)的一条记录。 **配置方式**: 多对一映射通过`&lt;many-to-one&gt;`标签实现,定义在...

    Hibernate一对多单向关联映射

    一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其下的所有员工,员工并不知道它们所属的部门。 二、配置映射文件 在Hibernate中...

    ssh--Employee_Dept--员工部门管理的CRUD

    "ssh--Employee_Dept--员工部门管理的CRUD"这个项目显然就是利用SSH框架实现了一个员工部门管理的系统,涵盖了增删改查(Create, Read, Update, Delete)的基本功能。下面我们将深入探讨SSH框架以及在员工部门管理中...

    MyBatis关联映射:一对一、一对多-代码.zip

    对于一对多的关系,例如一个部门有多名员工,MyBatis提供了以下方法进行映射: 1. **使用collection标签**:在resultMap中使用collection标签,指定一对多关联的集合类型(如List),通过column属性设置关联的外键...

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

    `表示一个员工隶属于一个部门,这是多对一关系。在映射配置文件中,需要使用`@OneToMany`和`@ManyToOne`注解来指定这些关系。 2. 多对多映射: 对于多对多关系,如项目和开发人员的关联,一个项目可能有多个开发...

    Hibernate一对多映射

    // 使用@ManyToOne注解声明多对一关系 @ManyToOne @JoinColumn(name = "user_id") private User user; // getters and setters } ``` **3. 关联的属性和操作** 在`User`类中,`orders`字段被标记为`@...

    Hibernate教程10_关系映射之多对一单向关联

    对于这个“多对一单向关联”,我们将仅在“多”端(员工实体)的映射中进行配置,因为它是单向的,即部门不会知道它有哪几个员工。 在XML映射文件中,我们可能会看到如下配置: ```xml &lt;!-- 员工实体映射 --&gt; ...

    hibernate 多对一映射

    - 在多对一关系中,通常在“一”的一方维护关系,因为一个部门可以有多个员工,但一个员工只有一个部门。所以在`Employee`类中,`department`属性是`Department`类型,表示员工所属的部门。 - Hibernate提供了懒...

    EF6多对多,一对多关系映射样例代码

    在本示例中,我们将深入探讨如何在EF6中配置和使用多对多和一对多关系,特别是针对Oracle数据库的配置。 首先,多对多关系是指两个实体类型之间存在多个连接,每个实体都可以关联到多个实例。例如,一个学生可以...

    oracle 数据库关系映射

    2. **多对多(N:M)关系映射**: - 多对多关系表示两个实体之间存在多种关联的可能性。这种情况下,通常需要创建一个新的关联表来存储两个实体间的关联信息。 - 比如,课程和学生之间的关系,一个学生可以选修多门...

    EJB3一对多和多对一关系映射实例

    在上面的部门与员工的例子中,如果我们将关注点放在员工上,那么可以说每个员工对应一个部门,这就是多对一关系。实际上,我们在`Employee`类中已经实现了这个关系,因为每个员工可以属于一个部门,而一个部门可以有...

    myeclipse试用小记----Hibernate多对一双向关联(2)

    在本篇【myeclipse试用小记----Hibernate多对一双向关联(2)】中,博主主要探讨了使用MyEclipse集成开发环境与Hibernate框架进行多对一双向关联的配置与实现。MyEclipse是Eclipse的一个强大扩展,特别适合Java Web...

Global site tag (gtag.js) - Google Analytics