本次以一个示例方式进行演示,某个单位有多个部门,每个部门中又有很多不同的员工,在存储时需要建立一张员工表和一张部门表,存储全部的部门和员工信息,而这两张表中通过外键进行关联,从而能根据部门名称查询出该部门的所有员工,同时又能根据员工名称查
本次以一个示例方式进行演示,某个单位有多个部门,每个部门中又有很多不同的员工,在存储时需要建立一张员工表和一张部门表,存储全部的部门和员工信息,而这两张表中通过外键进行关联,从而能根据部门名称查询出该部门的所有员工,同时又能根据员工名称查询出他所在的部门。
不难看出部门与员工之间的关系是一对多的关系,相反,员工与部门之间的关系是多对一的关系。
在pojo类和映射文件自然想到使用set集合表示一对多。
下面看一些部门类department类
package entity;import java.util.hashset;import java.util.set;public class department { private integer id; private string name; private set employees = new hashset(); public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public set getemployees() { return employees; } public void setemployees(set employees) { this.employees = employees; } }
该类中使用set集合存储员工信息,表示一个部门中有多个员工。
然后看员工类。
package entity;public class employee { private integer id; private string name; private department department; public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public department getdepartment() { return department; } public void setdepartment(department department) { this.department = department; } }
该类通过一个私有的department类的属性,表示一个员工只能属于一个部门。
下面看一下他们的映射文件的配置。
首先看department.hbm.xml
其中使用标签映射department类中的set集合属性,具体每隔属性在注释已经解释。通过表示两个关联类之间是一对多的关联关系。
然后看employee.hbm.xml
这里通过属性指定员工类与部门类之间的映射关系是多对一。其中每个元素的含义在注释中已经介绍。
然后他们之间的映射关系已经搭建完毕,下面看一下测试类,使用jutil进行测试。
package test;import static org.junit.assert.*;import java.util.iterator;import java.util.set;import org.hibernate.query;import org.hibernate.session;import org.hibernate.transaction;import entity.department;import entity.employee;import factory.hibernatesessionfactory;public class test { private session session = null; private transaction tran = null; //保存对象 @org.junit.test public void test() { session = hibernatesessionfactory.getsession(); tran = session.begintransaction(); try { //新建对象 department de = new department(); de.setid(3); de.setname(研发部); employee e1 = new employee(); e1.setid(1); e1.setname(张三); employee e2 = new employee(); e2.setid(2); e2.setname(李四); //建立关系映射 de.getemployees().add(e1); de.getemployees().add(e2); e1.setdepartment(de); e2.setdepartment(de); //保存数据 session.save(de); session.save(e1); session.save(e2); tran.commit(); } catch (exception e) { tran.rollback(); } } //根据部门查询员工 @org.junit.test public void getdepartment() { session = hibernatesessionfactory.getsession(); string hql = from department d where d.id = 2; query query = session.createquery(hql); department de = (department) query.uniqueresult(); set set = de.getemployees(); iterator it = set.iterator(); while (it.hasnext()) { employee e = (employee) it.next(); system.out.println(e.getname()); } } //根据员工查询部门 @org.junit.test public void getemployee() { session = hibernatesessionfactory.getsession(); string hql = from employee e where e.id=1; query query = session.createquery(hql); employee e = (employee) query.uniqueresult(); system.out.println(e.getname() + 属于 + e.getdepartment().getname()); } // 解除关联关系,相当于某一个员工离开原来部门,并不删除两个表中数据 // 从员工方删除 @org.junit.test public void removerelation() { session = hibernatesessionfactory.getsession(); tran = session.begintransaction(); try { department de = new department(); de.setid(1); de.setname(宣传部); session.save(de); employee e = (employee) session.get(employee.class, 3); e.setdepartment(de); session.save(e); tran.commit(); } catch (exception e) { tran.rollback(); } } // 删除员工方 @org.junit.test public void deleteemployee() { session = hibernatesessionfactory.getsession(); tran = session.begintransaction(); try { employee e = (employee) session.get(employee.class, 4); session.delete(e); tran.commit(); } catch (exception e) { tran.rollback(); } } // 删除部门 @org.junit.test public void deletedepartment() { session = hibernatesessionfactory.getsession(); tran = session.begintransaction(); try { department de = (department) session.get(department.class, 1); /* * 如果没有关联的员工,能删除 * 如果有关联的员工,且inverse属性为true,由于由不能维护关联,所以会直接执行删除,就会有异常 * 如果有关联的与昂,且inverse属性为false,由于可以维护关联关系,他就会先把关联的员工的外键设为null。在删除 */ session.delete(de); tran.commit(); } catch (exception e) { tran.rollback(); } }}