Hibernate关系映射

Categories:

关联映射就是将关系数据库中表的数据映射为java中的对象,以对象的形式表示,这样可以把对数据库的操作转化为对对象的操作。


单向多对一

images

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());
}

 

单向一对多

images

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());
	}
}

 

双向多对一

images

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());
}

 

多对多关联

 

一对一关联

——主键一对一

员工档案表结构

images

员工档案实体类

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();
}

 

——外键一对一

部门档案表结构

images

部门档案实体类

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>