随笔-95  评论-31  文章-10  trackbacks-0
使用MyEclipse hibernate 视图对ORACLE的视图进行映射反向生成,比如对ViewResult视图会生成两个类,一个hbm.xml文件,其中两个类名为:ViewResultId和ViewResult  配置文件为ViewResult.hbm.xml。那么使用HibernateTemplate模板类使用find(hql)进行查询的时候,比如hql="from ViewResult v where v.name='lx'";那么会出现第一个异常(异常内容明天补上。。。)原因是:视图没有主键,MyEclipse默认生成的是复合主键,即<composite-id><key-property></key-property></composite-id>。id由ViewResult类生成,于是将hql修改为:hql="from ViewResult v where v.id.name='lx'";发现可以进行查询不会报错了,但是却又发现查询的内容为null,这是第二个异常,原因为:MyEclipse默认生成的复合主键,<composite=id></composite-id>中间包括了视图所有的属性都为复合主键即<key-property>属性</key-property>,因为查询的记录里面某个字段为null,而主键不能为空,所以导致查询的记录全部都null,修改方法为:将视图中可以作为主键的属性放入<composite-id></composite-id>中,其余的放在外面修改为<property/>,这个时候查询又会出现,缺少get或者set方法的异常,所以最终的解决方法就是:把视图当成一个表,按hibernate常规思路进行配置即可解决,配置主键生成策略(视图没有主键,但是你可以根据业务需求找出一个可以当做主键的属性值),然后配置属性,这样就可以把视图当成一个实体用hql来查询了。
ps:HibernateTemplate模板没有提供分页的查询,只提供了setMaxResults(int)方法设置每页显示记录数,但是没有提供setFirstResult(int)设置从哪一行开始查询,所以使用了doInhibernate(HibernateCallback)进行接口回调直接使用session进行设置查询。当出现上述问题时候还以为是session关闭,使用了opensessionview过滤 但仍然报错,最后还是映射问题。

posted on 2010-09-17 00:04 朔望魔刃 阅读(5658) 评论(1)  编辑  收藏

评论:
# re: 关于hibernate映射视图若干问题小结 2013-12-24 15:39 | wsl
请问怎么才能在映射的过程中选择视图中的某一列作为主键  回复  更多评论
  

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


网站导航: