Hibernate一对多关系映射

        数据库两个表之间建立一对多关系的原理是将“一”的一方的主键作为“多”的一方的一个外键使用,而在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>

 

转载于:https://my.oschina.net/meshwon/blog/703613

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值