前言:
这是我学习的总结,如有不当,欢迎大家指点!
这里以员工和部门作为例子给大家解说:
假设,一个员工只有一个部门,但是一个部门就可以有多个员工。
那么员工和部门就是多对一关系,部门和员工就是一对多关系。
// 员工 - 部门
// 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" />