在Hibernate应用中使用视图

原创 2011年01月11日 22:51:00

开发环境: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就将视图结构本身做为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 empInfo=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映射文件里,<composite-id name="id" class="com.terry.hibernate.modal.EmployeedetialinfoId">



  转载请标明出处 http://blog.csdn.net/shimiso 

技术交流群:361579846


版权声明:本文为博主原创文章,未经博主允许不得转载。

Hibernate对视图的映射

在使用hibernate映射数据表,如果设置太多的映射关系,如many-to-one,one-to-many,one-to-one的话则hibernate生成的hql语句太多,造成太多的数据冗余,效率...
  • chenbinqq
  • chenbinqq
  • 2014年08月08日 20:27
  • 3262

在Eclipse中使用Hibernate一(组图)

转自:http://www.knowsky.com/365675.html 个人测试,该插件使用的主要步骤: 下载 eclipse的hibernate synchronizer 插件,然后在空白区...
  • lotusyangjun
  • lotusyangjun
  • 2014年02月12日 16:41
  • 1388

解决在oracle数据库中使用hibernate生成表不能正确创建表的问题

最近在项目中使用hibernate的动态生成表,即将hbm2ddl.auto配置成update时,发现hibernate并没有按照默认的生成规则生成相应的数据表信息。但奇怪的是,只是部分表没有生成,而...
  • vv354123
  • vv354123
  • 2014年09月28日 01:30
  • 1453

hibernate应用篇——视图查询/VO对应的查询

本文:主要讲述没有实体类对应表的查询。本文词汇:entity 指的是有对应表的bean 。 vo 只没有表对应的bean。 一、很多时候我们常常遇见,一个复杂的查询语句查询出来的东西用Obj...
  • u011377803
  • u011377803
  • 2015年12月08日 16:07
  • 408

关于创建与分析文档视图结构(使用MFC编写应用程序时用)

  • 2009年03月13日 23:26
  • 164KB
  • 下载

hibernate自己使用视图

1,首先要确定视图的结构  
  • hwt_211
  • hwt_211
  • 2012年10月16日 10:32
  • 350

iOS 9应用开发教程之使用开关滑块控件以及滚动部署视图

iOS 9应用开发教程之使用开关滑块控件以及滚动部署视图
  • u014621518
  • u014621518
  • 2015年08月12日 14:55
  • 672

Android视图切换库的使用之SwitchLayout的用法及实际应用案例

目前 Android 上并没有提供类似 iOS 的视图切换效果,所以很多类似 iOS 自带的炫酷的视图切换效果要实现起来比较麻烦,这里将会介绍一个 Android 上的比较好用的视图切换库,可以媲美 ...
  • qq220011qq
  • qq220011qq
  • 2015年06月27日 20:38
  • 711

【翻译】在Ext JS 6通用应用程序中使用既共享又特定于视图的代码

在本文,在展示如何编写Ext JS 6通用应用程序代码以使控制器和视图模型能适用于特定视图又是共享的。 本文的重点是通用应用程序,而不是只能用于纯classic或纯Modern的应用程序。特别是,a...
  • tianxiaode
  • tianxiaode
  • 2015年08月07日 15:52
  • 3261

Android应用性能优化系列视图篇——LayoutInflater使用的正确姿势

LayoutInflater是Android开发者接触最多的一个类之一,主要作用是用来解析layout资源文件,将其实例化成一个View对象。LayoutInflater的API非常非常简单,对开发者...
  • MegatronKings
  • MegatronKings
  • 2016年08月08日 00:14
  • 2500
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Hibernate应用中使用视图
举报原因:
原因补充:

(最多只允许输入30个字)