【学习笔记】实例解说Hibernate 一对多、多对一关联关系

前言:

这是我学习的总结,如有不当,欢迎大家指点!

这里以员工和部门作为例子给大家解说:

假设,一个员工只有一个部门,但是一个部门就可以有多个员工。

那么员工和部门就是多对一关系,部门和员工就是一对多关系。

// 员工 - 部门    
//  N   -  1

通常:外键在多的一方,引用“1”的一方的主键


主要的实体类:

Department.java

import java.util.Set;

/**
 * 部门
 * @author Jerry
 * Department.java
 * 
 */
public class Department {
	private Integer deptId;
	private String name;//部门名称
	
	// 有很多的员工
	private Set<Employee> list;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getDeptId() {
		return deptId;
	}

	public void setDeptId(Integer deptId) {
		this.deptId = deptId;
	}

	public Set<Employee> getList() {
		return list;
	}

	public void setList(Set<Employee> list) {
		this.list = list;
	}
}



Employee.java

/**
 * 员工
 * @author Jerry
 * Employee.java
 * 
 */
public class Employee {
	private Integer emId;
	private String name;
	
	// 员工也有部门
	private Department dept;


	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Department getDept() {
		return dept;
	}

	public void setDept(Department dept) {
		this.dept = dept;
	}

	public Integer getEmId() {
		return emId;
	}

	public void setEmId(Integer emId) {
		this.emId = emId;
	}
}



配置的映射文件:

Department.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="f_hbm_oneToMany">

	<!-- User表对应的映射关系 -->
	<class name="Department" table="department">
		<id name="deptId">
			<generator class="identity" />
		</id>
		<property column="name" generated="never" lazy="false" name="name" type="string" />
		
		<!-- Employee属性,List集合,表达的是本类与Employee的一对多的关系 -->
		<set name="list">
			<key column="dept"></key><!-- key元素:对方表中的外键列(多的那方的表) -->
			<one-to-many class="Employee"/><!-- 因为是关联关系,因此要用一对多声明 -->
		</set>
		
	</class>
</hibernate-mapping>



Employee.hbm.xml:外键的解释已经在里面了

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="f_hbm_oneToMany">

	<!-- User表对应的映射关系 -->
	<class name="Employee" table="employee">
		<id name="emId">
			<generator class="identity" />
		</id>
		<property column="name" name="name" type="string" />
		
		<!-- 
			department属性,表达的是本类与Department的多对一的关系 
			这里的column指的是这个外键的存放,可以不用写,hibernate会自动寻找Department类的映射文件,并且使用映射文件指定的列
			也可以与Department指定的<key column="dept"></key>相同,如果不同,hibernate会自动生成一个新的列,造成数据冗余
                        class属性:关联的实体类型
			column:外键列【关联对象的表的主键值】
		-->
		<many-to-one name="dept" class="Department"></many-to-one>
		
				
	</class>
</hibernate-mapping>



hibernate.cfg.xml文件就不说了,主要是引入两个类的映射文件

<mapping resource="Department.hbm.xml" />
<mapping resource="Employee.hbm.xml" />


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值