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