使用MyEclipse hibernate 視圖對(duì)ORACLE的視圖進(jìn)行映射反向生成,比如對(duì)ViewResult視圖會(huì)生成兩個(gè)類(lèi),一個(gè)hbm.xml文件,其中兩個(gè)類(lèi)名為:ViewResultId和ViewResult 配置文件為ViewResult.hbm.xml。那么使用HibernateTemplate模板類(lèi)使用find(hql)進(jìn)行查詢的時(shí)候,比如hql="from ViewResult v where v.name='lx'";那么會(huì)出現(xiàn)第一個(gè)異常(異常內(nèi)容明天補(bǔ)上。。。)原因是:視圖沒(méi)有主鍵,MyEclipse默認(rèn)生成的是復(fù)合主鍵,即<composite-id><key-property></key-property></composite-id>。id由ViewResult類(lèi)生成,于是將hql修改為:hql="from ViewResult v where v.id.name='lx'";發(fā)現(xiàn)可以進(jìn)行查詢不會(huì)報(bào)錯(cuò)了,但是卻又發(fā)現(xiàn)查詢的內(nèi)容為null,這是第二個(gè)異常,原因?yàn)椋篗yEclipse默認(rèn)生成的復(fù)合主鍵,<composite=id></composite-id>中間包括了視圖所有的屬性都為復(fù)合主鍵即<key-property>屬性</key-property>,因?yàn)椴樵兊挠涗浝锩婺硞€(gè)字段為null,而主鍵不能為空,所以導(dǎo)致查詢的記錄全部都null,修改方法為:將視圖中可以作為主鍵的屬性放入<composite-id></composite-id>中,其余的放在外面修改為<property/>,這個(gè)時(shí)候查詢又會(huì)出現(xiàn),缺少get或者set方法的異常,所以最終的解決方法就是:把視圖當(dāng)成一個(gè)表,按hibernate常規(guī)思路進(jìn)行配置即可解決,配置主鍵生成策略(視圖沒(méi)有主鍵,但是你可以根據(jù)業(yè)務(wù)需求找出一個(gè)可以當(dāng)做主鍵的屬性值),然后配置屬性,這樣就可以把視圖當(dāng)成一個(gè)實(shí)體用hql來(lái)查詢了。
ps:HibernateTemplate模板沒(méi)有提供分頁(yè)的查詢,只提供了setMaxResults(int)方法設(shè)置每頁(yè)顯示記錄數(shù),但是沒(méi)有提供setFirstResult(int)設(shè)置從哪一行開(kāi)始查詢,所以使用了doInhibernate(HibernateCallback)進(jìn)行接口回調(diào)直接使用session進(jìn)行設(shè)置查詢。當(dāng)出現(xiàn)上述問(wèn)題時(shí)候還以為是session關(guān)閉,使用了opensessionview過(guò)濾 但仍然報(bào)錯(cuò),最后還是映射問(wèn)題。
posted on 2010-09-17 00:04
朔望魔刃 閱讀(5667)
評(píng)論(1) 編輯 收藏