解析Hibernate視圖實例
本文主要講Hibernate視圖的創(chuàng)建,分析,查詢。下面是具體的分析以及相應(yīng)的代碼。
開發(fā)環(huán)境:Eclipse3.2+MyEclipse5.01GA;框架使用:Struts+Spring+Hibernate
在Employee數(shù)據(jù)庫中有三個表:EmployeeInfo(員工信息表)、Depts(部門表)、Business(職務(wù)表)
EmployeeInfo表結(jié)構(gòu):
- 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
在應(yīng)用程序中需要查詢員工的詳細信息,包括部門和職務(wù)名稱,要完成這樣的查詢需要較長較復(fù)雜的SQL代碼,與其在程序中書寫代碼不如在數(shù)據(jù)庫建立一個視圖來簡化程序的操作,其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語句創(chuàng)建了一個名為employeedetialinfo的視圖。現(xiàn)在需要用對Hibernate視圖進行映射,生成可持久化類對象。注意:在Hibernate3之后才支持對視圖的操作,Hibernate2并不支持如果你的項目中是使用Hibernate2就沒必要往下看了。
在Eclipse中切到MyEclipse DataBase Explorer(數(shù)據(jù)庫瀏覽視圖)中打開連接,找到Employee表,選擇下面的View子節(jié)點,可以看到一個名為employeedetialinfo的視圖,鼠標右鍵點擊它,選擇“Hibernate Reverse Engineering…”,設(shè)置了包路徑后,依次鉤選“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類里轉(zhuǎn)而使用了HibernateTemplate對象來操作數(shù)據(jù)庫,可以免去事務(wù)管理;這樣就生成完持久化類,需要注意的是生成Hibernate視圖映射和生成表映射不一樣,因為視圖是沒有主鍵的,Hibernate就將視圖結(jié)構(gòu)本身做為ID主鍵,所以你可看到生成出來的文件有四個,分別是
- Employeedetialinfo.hbm.xml(映射文件)
- Employeedetialinfo.java(持久化類文件)
- EmployeedetialinfoId.java(視圖的數(shù)據(jù)結(jié)構(gòu)類)
- EmployeedetialinfoDAO.java(DAO:Data Access Object用來簡化數(shù)據(jù)操作的類,常用的添加、刪除、更新、查詢都可以在這個類里得到快速的實現(xiàn))
如果對表進行映射是沒有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");//獲得頁面?zhèn)鬟f的員工編號
- 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");
- }
- }
在實際應(yīng)用中,我們需要根據(jù)一個已知的員工ID來得到他的詳細信息,之前我使用empInfoDAO.findById方法,這個方法傳遞進去的參數(shù)是一個EmployeedetialinfoId對象,我實際化了EmployeedetialinfoId類后再setEmpId,得出來的結(jié)果都是Nullpoint;整整找了快一個月的資料都沒能找出個所以然;后來我試了findByProperty方法,它在DAO類里的定義是這樣的:
- public List findByProperty(String propertyName, Object value)
第一個參數(shù)是類里的屬性名,第二個參數(shù)是值;需要注意的是如果在設(shè)置參數(shù)的時候直接傳empId這個屬性將會報錯,提示找不到這個屬性,而是需要在empId前面加上父類名Id,即"id.empId",這個ID是何許人也?它的定義就在Employeedetialinfo.hbm.xml映射文件里
- <composite-id name="id" class="com.terry.hibernate.modal.EmployeedetialinfoId">。
以上的操作就完成了對Hibernate視圖的查詢,小小經(jīng)驗,希望對您有用。
【編輯推薦】