Hibernate关系映射
Categories: Hibernate
关联映射就是将关系数据库中表的数据映射为java中的对象,以对象的形式表示,这样可以把对数据库的操作转化为对对象的操作。
单向多对一
Employee的映射文件如下
<?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="pojo.Employee" table="EMPLOYEE">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="11" scale="0"/>
<generator class="identity"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20"/>
</property>
<property name="job" type="java.lang.String">
<column name="JOB" length="100"/>
</property>
<property name="salary" type="java.lang.Float">
<column name="SALARY" precision="10" scale="0"/>
</property>
<property name="hireDate" type="java.util.Date">
<column name="HIRE_DATE"/>
</property>
<many-to-one name="dept" class="pojo.Dept" column="DEPT_ID"/>
</class>
</hibernate-mapping>
测试代码
public void testManyToOne() {
Employee employee=session.get(Employee.class,1);
System.out.println("员工姓名:"+employee.getName());
System.out.println("部门名称:"+employee.getDept().getName());
}
单向一对多
Dept的映射文件如下
<?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="pojo.Dept" table="DEPT">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="10" scale="0"/>
<generator class="identity"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20"/>
</property>
<set name="employees">
<key>
<column name="DEPT_ID"/>
</key>
<one-to-many class="pojo.Employee"/>
</set>
</class>
</hibernate-mapping>
测试代码
public void testOneToMany() {
Dept dept=session.get(Dept.class,4);
System.out.println("部门名称:"+dept.getName());
for(Employee emp:dept.getEmployees()){
System.out.println(emp.getId()+"姓名:"+emp.getName());
}
}
双向多对一
Dept.hbm.xml
<set name="employees">
<key>
<column name="DEPT_ID"/>
</key>
<one-to-many class="pojo.Employee"/>
</set>
Employee.hbm.xml
<many-to-one name="dept" class="pojo.Dept" column="DEPT_ID"/>
测试代码
public void testManyToOne2() {
Dept dept = session.get(Dept.class, 4);
System.out.println("部门名称:" + dept.getName());
//通过一方查询多方
for (Employee emp : dept.getEmployees()) {
System.out.println(emp.getId() + "姓名:" + emp.getName());
}
//通过多方查询一方
Employee employee=session.get(Employee.class,1);
System.out.println("员工姓名:" + employee.getName());
System.out.println("部门名称:"+employee.getDept().getName());
}
多对多关联
一对一关联
——主键一对一
员工档案表结构
员工档案实体类
public class EmpFile {
private Integer empId;
private String empInfo;
private Employee employee;
}
员工档案的映射文件
<?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="pojo.EmpFile" table="EMP_FILE">
<id name="empId" type="java.lang.Integer">
<column name="EMP_ID" precision="10" scale="0"/>
<generator class="foreign">
<param name="property">employee</param>
</generator>
</id>
<property name="empInfo" type="java.lang.String">
<column name="EMP_INFO" length="20"/>
</property>
<one-to-one name="employee" class="pojo.Employee" constrained="true"/>
</class>
</hibernate-mapping>
员工类中加入如下属性
private EmpFile empFile;
员工类映射文件中添加
<one-to-one name="empFile" class="pojo.EmpFile" cascade="save-update"/>
测试代码
public void test(){
Dept dept = session.get(Dept.class, 72);
Employee employee = new Employee();
employee.setName("小王");
employee.setDept(dept);
EmpFile file = new EmpFile();
file.setEmployee(employee);
file.setEmpInfo("小王的档案");
employee.setEmpFile(file);
Transaction transaction = session.beginTransaction();
session.save(employee);
transaction.commit();
}
——外键一对一
部门档案表结构
部门档案实体类
public class DeptFile {
private Integer id;
private String info;
private Dept dept;
}
部门档案映射文件
<?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="pojo.DeptFile" table="DEPT_FILE">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="10" scale="0"/>
<generator class="identity"/>
</id>
<property name="info" type="java.lang.String">
<column name="INFO" length="50"/>
</property>
<many-to-one name="dept" class="pojo.Dept" unique="true" column="DEPT_ID"/>
</class>
</hibernate-mapping>
部门类加入如下属性
private DeptFile deptFile;
部门映射文件中添加
<one-to-one name="deptFile" class="pojo.DeptFile" cascade="all"/>
测试代码
public void test(){
Dept dept = new Dept();
dept.setName("测试部");
DeptFile deptFile=new DeptFile();
deptFile.setDept(dept);
deptFile.setInfo("我是测试部");
dept.setDeptFile(deptFile);
Transaction transaction = session.beginTransaction();
session.save(dept);
transaction.commit();
}
延迟加载
——类级别延迟加载
<class name="pojo.Employee" table="EMPLOYEE" lazy="false">
——单端关联的延迟加载
<many-to-one name="dept" class="pojo.Dept" column="DEPT_ID" lazy="false"/>
——集合关联的延迟加载
<set name="employees" lazy="false">
<key>
<column name="DEPT_ID"/>
</key>
<one-to-many class="pojo.Employee"/>
</set>