一、思路
问题:
以往用Hibernate处理View时发生的困难主要集中在这两方面:
View是没有主键
由于View是由select语句生成,所以不存在任何主键。也就无法对其映射。
Hibernate必须对要操作的表进行po封装
Hibernate要求对数据库的操作都是通过pojo映射来实现的。也就是说无法对某个View直接读取而不对其进行映射。
如果强制用hibernate反转,会将所有的字段变成一个复合主键,关键是根本查不出数据来!
解决:
要解决以上问题,我采取一下方案: 在建立View的时候生成类似主键的字段,通过其他手段建立类似主键的字段。 并不需要另外建立这个主键!!!
在用Hibernate反转后,将复合主键po文件中构建器及geter/seter拷贝至主po文件中。同时修改相应的hbm.xml文件,手动随便把任一字段改为主键即可。
二、实现
建立视图
- create or replace view v_user_perm
- (
id,userid, moduleid) 其实id并不需要! - as
- select rownum,a.id,c.id
- from sysuser a,user_perm b,module c
- where a.id=b.userid
- and b.moduleid=c.id
这个视图是从两个表中分别取出id。
建立hbm.xml :
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//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">
<id name="id" column="ID" type="long"><column name="JHDM" length="14" />
<generator class="assigned" /></id>- 随便挑以下一个属性作主键即可
- <id name="userid" column="USERID" type="string" length="32" not-null="true">
- <generator class="assigned" />
- </id>
- <property name="moduleid" column="MODULEID" type="string" length="32" not-null="true"/>
- </class>
- </hibernate-mapping>
本文介绍了一种使用Hibernate处理数据库视图的方法,针对视图无主键的问题提出了创建虚拟主键并映射到POJO的解决方案,同时给出了具体的实现代码。
6765

被折叠的 条评论
为什么被折叠?



