解析Hibernate视图实例
本文主要讲Hibernate视图的创建,分析,查询。下面是具体的分析以及相应的代码。
开发环境:Eclipse3.2+MyEclipse5.01GA;框架使用:Struts+Spring+Hibernate
在Employee数据库中有三个表:EmployeeInfo(员工信息表)、Depts(部门表)、Business(职务表)
EmployeeInfo表结构:
emp_id主键 emp_name emp_sex emp_age emp_dept存储dept_id emp_business存储business_id emp_address Depts: dept_id主键 dept_name Business: business_id主键 business_name
在应用程序中需要查询员工的详细信息,包括部门和职务名称,要完成这样的查询需要较长较复杂的SQL代码,与其在程序中书写代码不如在数据库建立一个视图来简化程序的操作,其SQL代码如下:
create view employeedetialinfo AS (select e.emp_id,e.emp_name,e.emp_sex,e.emp_age,d.dept_name, b.business_name,e.emp_address from employeeinfo e,depts d,business b where e.emp_dept=d.dept_id and e.emp_business=b.business_id;
以上的SQL语句创建了一个名为employeedetialinfo的视图。现在需要用对Hibernate视图进行映射,生成可持久化类对象。注意:在Hibernate3之后才支持对视图的操作,Hibernate2并不支持如果你的项目中是使用Hibernate2就没必要往下看了。
在Eclipse中切到MyEclipse DataBase Explorer(数据库浏览视图)中打开连接,找到Employee表,选择下面的View子节点,可以看到一个名为employeedetialinfo的视图,鼠标右键点击它,选择“Hibernate Reverse Engineering…”,设置了包路径后,依次钩选“Hibernate Mapping File”、“Java Data Object”(取消钩选“Create abstract class”)以及“Java Data Access Object(DAO)”,在“Java Data Access Object(DAO)”下会自动钩选“Generate precise findby methods”,以及选择“Spring DAO”选项,使用“Spring DAO”后,在DAO类里转而使用了HibernateTemplate对象来操作数据库,可以免去事务管理;这样就生成完持久化类,需要注意的是生成Hibernate视图映射和生成表映射不一样,因为视图是没有主键的,Hibernate就将视图结构本身做为ID主键,所以你可看到生成出来的文件有四个,分别是
Employeedetialinfo.hbm.xml(映射文件) Employeedetialinfo.java(持久化类文件) EmployeedetialinfoId.java(视图的数据结构类) EmployeedetialinfoDAO.java(DAO:Data Access Object用来简化数据操作的类,常用的添加、删除、更新、查询都可以在这个类里得到快速的实现)
如果对表进行映射是没有EmployeedetialinfoId这个类文件的。
在Action中的处理代码是这样的:
public class EmployeeDetialAction extends ActionSupport { /* * Generated Methods */ /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String empId=request.getParameter("id");//获得页面传递的员工编号 EmployeedetialinfoDAO empInfoDAO=EmployeedetialinfoDAO .getFromApplicationContext(getWebApplicationContext()); List list=empInfoDAO.findByProperty("id.empId", empId); Employeedetialinfo emp=(Employeedetialinfo)(list.get(0)); EmployeedetialinfoId empempInfo=emp.getId(); request.setAttribute("empinfo", empInfo); return mapping.findForward("EmployeeDetial"); } }
在实际应用中,我们需要根据一个已知的员工ID来得到他的详细信息,之前我使用empInfoDAO.findById方法,这个方法传递进去的参数是一个EmployeedetialinfoId对象,我实际化了EmployeedetialinfoId类后再setEmpId,得出来的结果都是Nullpoint;整整找了快一个月的资料都没能找出个所以然;后来我试了findByProperty方法,它在DAO类里的定义是这样的:
public List findByProperty(String propertyName, Object value)
第一个参数是类里的属性名,第二个参数是值;需要注意的是如果在设置参数的时候直接传empId这个属性将会报错,提示找不到这个属性,而是需要在empId前面加上父类名Id,即"id.empId",这个ID是何许人也?它的定义就在Employeedetialinfo.hbm.xml映射文件里