Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题

来源:互联网 发布:安卓变声软件 编辑:程序博客网 时间:2024/06/06 02:16

Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题

    博客分类: 
  • Hibernate
HibernateSQLJDBC
Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题 

今天在用hibernate对视图进行查询时,对于返回的list,发现里面所有对象都是同一个对象,连地址都是一样的, 
但把查询语句放到PL/SQL中查询,结果如下: 

Java代码  收藏代码
  1.    ID  CCTID CONTRACTID CONTRACTNAME  CERTTYPEID CERTTYPENAME   
  2. ----- ------ ---------- ------------- ---------- -------------  
  3. 32347 100391      71225 2008年清远分       8911  传输中级       
  4. 32347 118362     118360 2010年度test       8911  传输中级       
  5. 32347 118418     118416 2009年度test3      8911  传输中级       

实体对象的Hibernate配置片段如下: 
Java代码  收藏代码
  1. <class name="com.huawei.nsm.outsrc4.vo.Os4VDemandCert" table="V_OUTSRC4_DEMANDCERT">  
  2.     <id name="id" type="java.lang.Long">  
  3.         <column name="ID"   />  
  4.         <generator class="sequence" >  
  5.             <param name="sequence">SEQ_OUTSRC4_SHARED</param>  
  6.         </generator>  
  7.     </id>  
  8. .  

除了table="V_OUTSRC4_DEMANDCERT" 是视图外..别的没有任何特别的地方,id随便生成就可以了.因为是视图,用来查询的,id就随便了. 

java代码片段如下: 
Java代码  收藏代码
  1. queryHql = "FROM Os4VDemandCert WHERE id=?";  
  2.   
  3.             query = session.createQuery(queryHql);  
  4.             query.setLong(0,new Long(32347));  
  5.             List demandCerts = query.list();  
  6.   
  7.             for (int i = 0; i < demandCerts.size(); i++)  
  8.             {  
  9.                 Os4VDemandCert demandCert = (Os4VDemandCert) demandCerts.get(i);  
  10.                 System.out.println("===================>       " + demandCert);  
  11.             }  

代码运行的结果如下: 
Java代码  收藏代码
  1. ===================>       com.huawei.nsm.outsrc4.vo.Os4VDemandCert@2ffed5  
  2. ===================>       com.huawei.nsm.outsrc4.vo.Os4VDemandCert@2ffed5  
  3. ===================>       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

0 0
原创粉丝点击