?
在初學(xué)Hibernate的時(shí)候就聽(tīng)說(shuō)此技術(shù)對(duì)View支持的不是很好。因?yàn)槲乙矝](méi)有用到也就沒(méi)有多想。后來(lái)因?yàn)楣こ绦枰坏貌粚?duì)此作一番研究。最終找到了一條可行的解決方案。特此總結(jié),共大家分享。
一、思路
問(wèn)題:
以往用Hibernate處理View時(shí)發(fā)生的困難主要集中在這兩方面:
View是沒(méi)有主鍵
由于View是由select語(yǔ)句生成,所以不存在任何主鍵。也就無(wú)法對(duì)其映射。
Hibernate必須對(duì)要操作的表進(jìn)行po封裝
Hibernate要求對(duì)數(shù)據(jù)庫(kù)的操作都是通過(guò)pojo映射來(lái)實(shí)現(xiàn)的。也就是說(shuō)無(wú)法對(duì)某個(gè)View直接讀取而不對(duì)其進(jìn)行映射。
解決:
要解決以上問(wèn)題,我采取一下方案:
在建立View的時(shí)候生成類(lèi)似主鍵的字段
通過(guò)其他手段建立類(lèi)似主鍵的字段。
在映射po的時(shí)候手動(dòng)把這個(gè)字段改為主鍵
將虛擬字段改為主鍵。根據(jù)虛擬的情況給以不同的自增長(zhǎng)類(lèi)型。
二、實(shí)現(xiàn)
我是在Oracle+Tomcat環(huán)境下測(cè)試成功的。
下面詳細(xì)介紹一下步驟。
建立視圖
代碼
createorreplaceviewv_user_perm
(id,userid,moduleid)
as
selectrownum,a.id,c.id
fromsysusera,user_permb,module c
wherea.id=b.userid
andb.moduleid=c.id
這個(gè)視圖是從兩個(gè)表中分別取出id,然后我將生成的視圖的行號(hào)作為id處理。
建立xml
代碼
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/Hibernate Mapping DTD 2.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.fulong.journal.cad.po.perm.VUserPerm"table="V_USER_PERM"schema="JCAD">
<idname="id"column="ID"type="long">
<generatorclass="increment"/>
</id>
<property name="userid" column="USERID" type="string" length="32" not-null="true"/>
<propertyname="moduleid"column="MODULEID"type="string"length="32"not-null="true"/>
</class>
</hibernate-mapping>
建立java
代碼
importjava.io.Serializable;
importorg.apache.commons.lang.builder.ToStringBuilder;
/** @author Hibernate CodeGenerator */
publicclass VUserPermimplementsSerializable{
/** persistent field */
privatelongid;
/** persistent field */
privateStringuserid;
/** persistent field */
privateStringmoduleid;
/** full constructor */
publicVUserPerm(Stringuserid,Stringmoduleid){
this.userid=userid;
this.moduleid=moduleid;
}
/** default constructor */
publicVUserPerm(){
}
publiclonggetId(){
returnthis.id;
}
publicvoidsetId(longid){
this.id=id;
}
publicStringgetUserid(){
returnthis.userid;
}
publicvoidsetUserid(Stringuserid){
this.userid=userid;
}
publicStringgetModuleid(){
returnthis.moduleid;
}
publicvoidsetModuleid(Stringmoduleid){
this.moduleid=moduleid;
}
publicStringtoString(){
returnnewToStringBuilder(this)
.toString();
}
}
這樣就一個(gè)把一個(gè)視圖當(dāng)成表來(lái)查詢(xún)了。不過(guò)插入是不可能的了。
大家有什么看法可以一起討論。