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