文档章节

Hibernate一对多关系映射

meshwon
 meshwon
发布于 2016/06/30 20:06
字数 649
阅读 7
收藏 0

        数据库两个表之间建立一对多关系的原理是将“一”的一方的主键作为“多”的一方的一个外键使用,而在hibernate中想要将两个类映射到数据库中并体现一对多的关系,那么需要利用到注解或者XML文件配置。

        下面就举一个实例来说明一下Hibernate的一对多关系怎样利用XML文件来完成一对多映射的,比如有一个部门和员工的类,简单的代码实现如下;

        先实现一个Dept类,在部门类中有一个Set集合,主要保存的数据就是“多”的一方的数据,记保存员工的信息;

package com.pac.hibernate.entity;

import java.io.Serializable;
import java.util.HashSet;

public class Dept implements Serializable{
	
	private int deptId;
	private String deptName;
	private HashSet<Employee> emps = new HashSet<Employee>(0);
	
	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 HashSet<Employee> getEmps() {
		return emps;
	}
	public void setEmps(HashSet<Employee> emps) {
		this.emps = emps;
	}
	
}

        完成对应的类到数据库数据的映射,set集合中的name的值既是Dept类中的set集合的属性名;cascade即表示级联的操作包括哪些动作。

<?xml version="1.0" encoding="utf-8"?>
<!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.pac.hibernate.entity.Dept" table="dept">
		<id name="deptId">
			<column name="dept_id" />
			<generator class="native"></generator>
		</id>
		<property name="deptName" type="java.lang.String">
			<column name="d_name" length="20" not-null="true" />
		</property>
		
		<!-- 配置Set集合中的东西,并且将Dept的主键与employee表关联起来 -->
		<set name="emps" cascade="save-update,delete">
			<!-- 将数据库表中的dept_id作为与employee关联的外键字段,因此必须指定的是数据库中的字段的名 -->
			<key column="dept_id"></key>
			<!-- set集合中关联的的类类型 -->
			<one-to-many class="com.pac.hibernate.entity.Employee"></one-to-many>
		</set>
	</class>
</hibernate-mapping>

        员工表的实现中包含了Dept表,主要体现了某个员工只能属于一个部门;代码如下

package com.pac.hibernate.entity;

import java.io.Serializable;

public class Employee implements Serializable{

	private int empId;
	private String empName;
	private Double salary;
	//希望查员工的时候可以查出部门,而且是唯一的
	private Dept 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 Dept getDept() {
		return dept;
	}
	public void setDept(Dept dept) {
		this.dept = dept;
	}
	
}

        员工表对应的XML配置文件;

<?xml version="1.0" encoding="utf-8"?>
<!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.pac.hibernate.entity.Employee" table="employee">
		<id name="empId">
			<column name="emp_id" />
			<generator class="native"></generator>
		</id>
		<property name="empName" type="java.lang.String">
			<column name="e_name" length="20" not-null="true" />
		</property>
		
		<property name="salary" type="java.lang.Double">
			<column name="e_sal"/>
		</property>
		
		<many-to-one name="dept" column="dept_id"></many-to-one>
	</class>
</hibernate-mapping>

 

© 著作权归作者所有

共有 人打赏支持
上一篇: freeMarker入门
下一篇: 数据库存储过程
meshwon
粉丝 1
博文 29
码字总数 19085
作品 0
哈尔滨
程序员
私信 提问

暂无文章

Alpakka Kafka,反应式Kafka客户端

Alpakka Kafka 是一个要用于 Java 和 Scala 语言的开源的流感知和反应式集成数据线项目。它建立在 Akka Stream之上,提供了 DSL 来支持反应式和流式编程,内置回压功能。Akka Streams 是 Re...

羊八井
30分钟前
3
0
PHP7源码编译安装详解

$ yum groupinstall "development tools"$ yum install -y gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype \freetype-devel libpng libpng-devel libxml2 ......

问题终结者
35分钟前
3
0
Django学习笔记-从创建虚拟环境到启用服务

1 前置条件 windows系统下,目前已经完成anaconda3或miniconda3的安装,这也意味着已经完成了python3的安装。 2 创建虚拟环境 1、通过Anaconda Prompt,使用conda命令创建虚拟环境(base) e...

davidwbnu
昨天
3
0
python学习04:函数的定义及基本使用

python可以像c++一样,可以直接定义函数。具体格式如下: def(关键字) 函数名(形参01,形参02...): do_something... #如果有返回值,则调用以下语句 return 返回值...

太空堡垒
昨天
2
0
深夜杂想

今天周六,从上午9点钟一直码代码到下午5点钟。然后下午又睡了很久。吃过晚饭后来本想晚上再写点代码,不知道为啥,没有任何状态,一直发呆到现在。想起自己计划在元旦节(或者春节)写点自己...

元谷
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部