(06)自定义类型的关联映射

基本的需求:在一个部门(Department)里面有多个员工(Employee),符合1:N的关系。

在05节当中,使用了最基础的类型String。而在本节当中,使用用户自定义的Department类和Employee类,不过,这也正是需要重点讨论的问题。

本节的重点是:自定义的类型的映射 和 1:N关系的映射。

其中涉及到<one-to-many>和<many-to-one>标签,把握它们的本质要抓住4个概念:表(table)、字段(column)、类(Class)和属性(property)。

Department.java

package com.rk.hibernate.g_one2Many;

import java.util.Set;

public class Department
{
	private int deptId;
	private String deptName;
	private Set<Employee> emps;
	public int getDeptId()
	{
		return deptId;
	}
	public void setDeptId(int deptId)
	{
		this.deptId = deptId;
	}
	public String getDeptName()
	{
		return deptName;
	}
	public void setDeptName(String deptName)
	{
		this.deptName = deptName;
	}
	public Set<Employee> getEmps()
	{
		return emps;
	}
	public void setEmps(Set<Employee> emps)
	{
		this.emps = emps;
	}
}

Department.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.hibernate.g_one2Many" auto-import="true">
	<class name="Department" table="T_Department">
		<id name="deptId" column="id">
			<generator class="native"></generator>
		</id>
		<property name="deptName" column="name" type="string"></property>
		<set name="emps" table="T_Employee">
			<key column="deptId"></key>
			<one-to-many class="Employee"/>
		</set>
	</class>
</hibernate-mapping>

Employee.java

package com.rk.hibernate.g_one2Many;

public class Employee
{
	private int empId;
	private String empName;
	private double salary;
	private Department dept;
	public int getEmpId()
	{
		return empId;
	}
	public void setEmpId(int empId)
	{
		this.empId = empId;
	}
	public String getEmpName()
	{
		return empName;
	}
	public void setEmpName(String empName)
	{
		this.empName = empName;
	}
	public double getSalary()
	{
		return salary;
	}
	public void setSalary(double salary)
	{
		this.salary = salary;
	}
	public Department getDept()
	{
		return dept;
	}
	public void setDept(Department dept)
	{
		this.dept = dept;
	}
}

Employee.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.hibernate.g_one2Many" auto-import="true">
	<class name="Employee" table="T_Employee">
		<id name="empId" column="id">
			<generator class="native"></generator>
		</id>
		<property name="empName" column="name"></property>
		<property name="salary" column="salary"></property>
		<many-to-one name="dept" column="deptId" class="Department"></many-to-one>
	</class>
</hibernate-mapping>

App.java

package com.rk.hibernate.g_one2Many;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App1
{
	private static SessionFactory sf;
	static
	{
		sf = new Configuration()
						.configure()
						.addClass(Department.class)
						.addClass(Employee.class)
						.buildSessionFactory();
	}

	// 保存【由Department来维护Department和Employee的关系】
	@Test
	public void testSaveDepartment()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		//员工1
		Employee emp1 = new Employee();
		emp1.setEmpName("张三");
		emp1.setSalary(1000);

		//员工2
		Employee emp2 = new Employee();
		emp2.setEmpName("李四");
		emp2.setSalary(800);

		//部门
		Department dept = new Department();
		dept.setDeptName("开发部门");
		Set<Employee> emps = new HashSet<Employee>();
		emps.add(emp1);
		emps.add(emp2);
		dept.setEmps(emps);//在部门上建立Department和Employee的关系

		//保存
		//注意:三者都要进行保存。
		//如果仅保存dept对象,dept只是维护了部门和员工之间关系,
		//Hibernate并不会将emp1和emp2也进行保存
		session.save(dept);
		session.save(emp1);
		session.save(emp2);

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

	// 【推荐使用这种方法】 【由Employee来维护Department和Employee之间的关系】
	@Test
	public void testSaveEmployee()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		//部门
		Department dept = new Department();
		dept.setDeptName("办公室");

		//员工1
		Employee emp1 = new Employee();
		emp1.setEmpName("小明");
		emp1.setSalary(1000);
		emp1.setDept(dept);//由员工来维护Department和Employee之间的关系

		//员工2
		Employee emp2 = new Employee();
		emp2.setEmpName("小红");
		emp2.setSalary(800);
		emp2.setDept(dept);//由员工来维护Department和Employee之间的关系

		//保存
		//部门和员工的关系是1:N,先保存代表1的那一方,再保存代表N的那一方
		session.save(dept);
		session.save(emp1);
		session.save(emp2);

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

	@Test
	public void testGetDepartment()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		Department dept = (Department) session.get(Department.class, 2);
		System.out.println(dept.getDeptId());
		System.out.println(dept.getDeptName());
		System.out.println(dept.getEmps());// 通过部门来获取员工,懒加载

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}

	@Test
	public void testGetEmployee()
	{
		Session session = sf.openSession();
		session.beginTransaction();

		Employee emp = (Employee) session.get(Employee.class, 3);
		System.out.println(emp.getEmpId());
		System.out.println(emp.getEmpName());
		System.out.println(emp.getSalary());
		System.out.println(emp.getDept().getDeptName());// 通过员工,获取部门信息,懒加载

		session.getTransaction().commit();
		session.close();
		System.out.println("执行结束!");
	}
}
时间: 2024-10-01 07:40:05

(06)自定义类型的关联映射的相关文章

9、Hibernate之关联映射(hibernate映射)

回顾Hibernate: 1. hibernate开发环境搭建 --> 引入jar: hibernate.jar + required + jpa + 驱动包 -> hibernate.cfg.xml -> javabean/*.hbm.xml -> Application 测试 2.hibernate api --> Configuration --> SessionFactory --> Session -> Transaction --->Que

【Spring】利用spring的JdbcTemplate查询返回结果映射到自定义类型

// org.springframework.jdbc.core.JdbcTemplate 中的查询方法基本都有支持参数RowMapper<T> rowMapper的重载方法.下面只是随便举例2个,还有很多 public <T> List<T> query(String sql, Object[] args, RowMapper<T> rowMapper) throws DataAccessException { ... }; public <T>

Hibernate框架之关联映射入门

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一:配置单向多对一关联 在Emp类中定义一个Dept属性,而在Dept类中无须定义用于存放Emp对象的集合属性 01.Dept.java package cn.zhang.entity; //部门实体类 public class Dept { private Integer deptid;//编号 private String deptname;//名称 public Integer getDeptid() { return

oracle 自定义类型 type / create type

一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integer.smallint. 3.日期类型.如:date.interval.timestamp. 4.PL/SQL类型.如:pls_integer.binary_integer.binary_double(10g).binary_float(10g).boolean.plsql类型是不能在sql环境中使

关联映射、关联查询

1 什么叫关联映射 通过数据库对象之间的关联关系(一对一.一对多.多对多),反映到实体对象上之间的引用. 举例 用户实体类(User):user_id user_name user_token 笔记本实体类(Book):book_id user_id book_name 一个笔记本对应一个用户(一对一).一个用户对应多个笔记本(一对多) 案例:根据用户ID去查询用户信息以及该用户所有的笔记信息时就需要用到关联查询,所以就需要用到关联映射 关联查询实体类:user_id user_name use

Hibernate之1-N关联映射

一.Hibernate之1-N关联映射 1. 哪边是 1 , 哪边是多 ? 需要从业务的角度来说明.例如,Employee 和 Department 之间就是 n-1 的关联关系,Order 和 Customer 之间也是 n-1 的关联关系. 1). 关联关系是有方向的: 2). 如何在类中来建立关联关系呢 ? 解:通过成员变量的方式即可. 2. 单向 n-1 关联关系 1). 域对象中,在 Order 中声明一个 Customer 类型的成员变量,并提供 setter.getter publ

Mybatis关联映射

Mybatis是半自动化的ORM框架,相比于Hibernate具有更好的灵活性,更容易进行性能优化,当然Hibernate和Mybatis各具特点,并不存在技术的优劣问题,只是应用场景不同,对于一个优秀的开发人员来说最好二者的技术都能掌握.Mybatis需要程序员完成实体类属性和数据库表字段之间的映射设计,并可以定制化返回类型,因此具有更高的灵活性,设计数据库表间的关联映射是Mybatis的核心,本文主要描述Mybatis进行表间关联映射设计的基本内容,包括完成一对一.一对多.多对多常见关联关系

struts2自定义类型转换器

首先,何为struts2的类型转换器? 类型转换器的作用是将请求中的字符串或字符串数组参数与action中的对象进行相互转换. 一.大部分时候,使用struts2提供的类型转换器以及OGNL类型转换机制即可满足大部分类型转换需求.如: 类User.java package models; public class User { private String username; private String password; public String getUsername() { retur

关联映射

1.什么是关联映射 若两张表具有关联关系,我们可以在实体对象和映射关系文件中配置这种关系,然后使用Hibernate操作其中一张表时,他可以通过配置关系自动的帮我们操作到另一张表,这种通过配置自动操作另一张表的手段称之为关联映射. 2.关联映射的左右 当我们操作一张表的时候,Hibernate可以通过关联映射自动帮我们操作其关系表. 这种关联操作包括 关联查询出关系表的数据 关联新增.修改关系表的数据 关联删除关系表的数据 3.关联映射的类型 一对多关联 多对一关联 多对多关联 一对一关联 继承