Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
今天在用hibernate对视图进行查询时,对于返回的list,发现里面所有对象都是同一个对象,连地址都是一样的,
但把查询语句放到PL/SQL中查询,结果如下:
ID CCTID CONTRACTID CONTRACTNAME CERTTYPEID CERTTYPENAME
----- ------ ---------- ------------- ---------- -------------
32347 100391 71225 2008年清远分 8911 传输中级
32347 118362 118360 2010年度test 8911 传输中级
32347 118418 118416 2009年度test3 8911 传输中级
实体对象的Hibernate配置片段如下:
<class name="com.huawei.nsm.outsrc4.vo.Os4VDemandCert" table="V_OUTSRC4_DEMANDCERT">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="sequence" >
<param name="sequence">SEQ_OUTSRC4_SHARED</param>
</generator>
</id>
省略...
除了table="V_OUTSRC4_DEMANDCERT" 是视图外..别的没有任何特别的地方,id随便生成就可以了.因为是视图,用来查询的,id就随便了.
java代码片段如下:
queryHql = "FROM Os4VDemandCert WHERE id=?";
query = session.createQuery(queryHql);
query.setLong(0,new Long(32347));
List demandCerts = query.list();
for (int i = 0; i < demandCerts.size(); i++)
{
Os4VDemandCert demandCert = (Os4VDemandCert) demandCerts.get(i);
System.out.println("===================> " + demandCert);
}
代码运行的结果如下:
===================> com.huawei.nsm.outsrc4.vo.Os4VDemandCert@2ffed5
===================> com.huawei.nsm.outsrc4.vo.Os4VDemandCert@2ffed5
===================> com.huawei.nsm.outsrc4.vo.Os4VDemandCert@2ffed5
可见.list中的三个对象,都是一样的.
这是什么原因呢?
其实很简单,因为hibernate配置文件上,我这个实体的主键是ID字段,而我的视图,ID并不能作为唯一标识,所以,当hibernate查数据库的第一条纪录的时候,就生成了一个
Os4VDemandCert对象,放在持久对象池里,
当再去查第二条纪录的时候,hibernate发现第二条纪录的ID和持久池里那第一条纪录的ID是一样的,所以就不重复生成新的对象了,直接拿持久池里原有的那个对象放到list中去,第三条纪录也一样.
这样,就导致list中的3个对象都是一样的结果.
这个跟Override了对象的hashCode和equals方法没有关系.
要解决上面的问题.可以用JDBC,或者在Hibernate上给对象配置联合主键来避免..
在以后准备写一个VO来映射数据库中的视图的时候,先注意下一视图是不是有唯一字段,如果有,就拿能唯一标识一条纪录的那个字段来作为主键,或许用联合主键.
分享到:
相关推荐
使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...
北大青鸟ACCP6.0Hibernate影院信息查询系统数据库
hibernate同时配置多个数据库连接 可以同时连接不同IP的不同数据库
//该方法会立即加载/获取数据(只要调用该方法就会立即向数据库发出查询语句),该方法只在内部缓存查找数据,如果内部缓存中没有数据就直接去数据库查询,当数据库中没有要查询的数据时返回null (6).load(Class ...
hibernate分页查询 数据库连接,不错的分析,可以尝试下载易用。。
hibernate将本地SQL查询结果封装成对象。如进行复杂的统计等本地sql语句查询后,直接放到对象里了,而不会再使用Object进行强转
对hibernate的数据库操作封装: 1.分页查询 2.保存对象 3.保存对象组 4. 更新对象 5.更新对象组 6.保存或更新对象 7.保存或更新对象组 8. 删除对象 9. 删除对象组 10.删除对象(此类的所有对象) 11.删除(HQL) 12....
hibernate将本地SQL查询结果封装成对象(最终).zip
Hibernate的视图功能 网上找的 , 自己实验过,能用
在hibernate中配置多数据库,并自由切换
该实例实现了Hibernate的多对多关联映射,附带了数据库代码,容易理解
hibernate支持的所有数据库方言。用起来很方便。
Hibernate配置文件中配置各种数据库的driver、URL
基于hibernate映射文件生成数据库的案例
hibernate数据库中文乱码问题2008年09月16日 星期二 下午 12:00我的数据库用的是mysq,编码我设成了utf-8! 用自己写的连接池可以设置编码
Hibernate多数据库支持解决方案 一、 去掉数据库级的外键关联 二、 如何动态加载.hbm.xml文件 三、 配置文件的加载 四、 大字段处理 五、 hibernate主键生成器(数值型主键操作方法) 六、 Oracle 转换 SQL Server ...
DmDialect-for-hibernate2.0、DmDialect-for-hibernate2.1、DmDialect-for-hibernate3.0、DmDialect-for-hibernate3.1、DmDialect-for-hibernate3.6、DmDialect-for-hibernate4.0、DmDialect-for-hibernate5.0、...
HibernateSHibernateSpring数据库的事务HibernateSpring数据库的事务HibernateSpring数据库的事务pring数据库的事务
轻量级的Hibernate,用于android客户端,通过简单的标签@Table,@Column,@Id即可持久化表,字段和id的定义。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库 Hibernate最初级的操作,使用SchemaExport创建数据表 本资源自带...