Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
2014-11-23 22:54
411 查看
Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
博客分类: HibernateHibernateSQLJDBC
Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
今天在用hibernate对视图进行查询时,对于返回的list,发现里面所有对象都是同一个对象,连地址都是一样的,
但把查询语句放到PL/SQL中查询,结果如下:
Java代码
ID CCTID CONTRACTID CONTRACTNAME CERTTYPEID CERTTYPENAME
----- ------ ---------- ------------- ---------- -------------
32347 100391 71225 2008年清远分 8911 传输中级
32347 118362 118360 2010年度test 8911 传输中级
32347 118418 118416 2009年度test3 8911 传输中级
实体对象的Hibernate配置片段如下:
Java代码
<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代码片段如下:
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);
}
代码运行的结果如下:
Java代码
===================> 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来映射数据库中的视图的时候,先注意下一视图是不是有唯一字段,如果有,就拿能唯一标识一条纪录的那个字段来作为主键,或许用联合主键.
from: http://t8500071.iteye.com/blog/344193
相关文章推荐
- Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
- oracle 数据库随机返回查询纪录
- 查询某个数据库下所有用到某张数据表的数据库对象: 存储过程 或 视图
- C# Spring.Net 使用对象映射(RowMapper)返回数据库查询到的结果集
- 手动写一个将数据库中查询的内容封装到对象中
- 用hibernate 多表联合查询时每条记录返回的都是个对象数组
- JAVA 利用反射机制查询数据库返回相应对象
- jdbc查询数据库返回实体对象集合
- 把从数据库中查询出的一个字段封装到一个List中,返回List
- 遇见了奇怪bug,前端用的AngularJs,后台是SpringMVC,持久用的hibernate,跟后台断点时查询数据库返回一条数据,否则返回两条,以下是问题详述
- ibatis 读取数据库数据,没有查询到,则返回的java对象为null
- 解决Hibernate查找视图有一个空值的时候返回的对象为null的问题
- 如何封装一个数据库查询,并把结果返回给调用者
- 【整理】SQLServer查询各种数据库对象(表,索引,视图,图表,存储过程等)
- 关于PHP中查询返回结果集和对象问题
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
- Hibernate查询视图返回null问题说明及解决办法
- mybatise查询返回的一个集合封装多个对象的实现
- 关于对 实体封装的对象 进行数据库操作时需要注意的问题
- ThinkPHP 中 M 方法查询数据库最后使用 find() 导致返回结果集 foreach 数据不对的问题