posts - 66,  comments - 40,  trackbacks - 0
 

在初学Hibernate的时候就听说此技术对View支持的不是很好。因为我也没有用到也就没有多想。后来因为工程需要,不得不对此作一番研究。最终找到了一条可行的解决方案。特此总结,共大家分享。
一、思路
问题:
以往用Hibernate处理View时发生的困难主要集中在这两方面:
View是没有主键
由于View是由select语句生成,所以不存在任何主键。也就无法对其映射。
Hibernate必须对要操作的表进行po封装
Hibernate要求对数据库的操作都是通过pojo映射来实现的。也就是说无法对某个View直接读取而不对其进行映射。
解决:
要解决以上问题,我采取一下方案:
在建立View的时候生成类似主键的字段
通过其他手段建立类似主键的字段。
在映射po的时候手动把这个字段改为主键
将虚拟字段改为主键。根据虚拟的情况给以不同的自增长类型。
二、实现
我是在Oracle+Tomcat环境下测试成功的。
下面详细介绍一下步骤。
建立视图

代码
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

这个视图是从两个表中分别取出id,然后我将生成的视图的行号作为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();
}

}


这样就一个把一个视图当成表来查询了。不过插入是不可能的了。&#61514;
大家有什么看法可以一起讨论。

posted on 2006-09-12 11:22 happytian 阅读(1744) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

Welcome here, my friend!

常用链接

留言簿(12)

随笔档案(66)

文章分类

文章档案(63)

web

最新随笔

搜索

  •  

积分与排名

  • 积分 - 88614
  • 排名 - 646

最新评论

阅读排行榜

评论排行榜