`
t8500071
  • 浏览: 112905 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
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来映射数据库中的视图的时候,先注意下一视图是不是有唯一字段,如果有,就拿能唯一标识一条纪录的那个字段来作为主键,或许用联合主键.
分享到:
评论

相关推荐

    hibernate将本地SQL查询结果封装成对象

    要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询返回的对象类型以及字段与数据库列的对应关系。例如: ```xml &lt;hibernate-mapping&gt; ...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了数据库操作。本教程将详细解释如何使用Hibernate将本地SQL查询的结果封装成对象,以便...

    hibernate 视图

    总之,Hibernate视图提供了对数据库视图的封装,使得我们可以像操作普通实体一样处理视图数据。虽然视图通常用于只读操作,但结合Hibernate的映射机制,我们可以方便地在Java应用程序中使用视图,提高代码的可维护性...

    Hibernate 多数据库支持解决方案

    在处理多数据库支持时,Hibernate提供了一些策略和技巧来确保应用程序能够在不同类型的数据库之间灵活切换。以下是一些关键点的详细说明: 1. **去掉数据库级的外键关联** - 在多数据库环境中,由于不同数据库对外...

    hibernate将本地SQL查询结果封装成对象(最终)

    使用本地sql语句查询后,无需再使用Object对查询结果进行强制转换,而是直接将查询结果放到实体Bean里了。 PS: 其实只有一版,这里只所以叫最终版是因为该附件我上传了好几天传不上去,到最后报告说‘资源已经存在...

    访问数据库基本封装(spring/hibernate/ibatis)

    本篇文章将深入探讨三个流行的Java框架:Spring、Hibernate和iBatis,它们都提供了对数据库操作的高效封装,使得开发人员能够更便捷地处理数据库事务。 首先,Spring框架以其强大的依赖注入和面向切面编程闻名,它...

    Hibernate封装dao层

    - **Session的使用**:每个数据库操作都应在一个Session中完成,并确保在操作完成后关闭Session。可以使用try-with-resources语句确保Session的关闭。 - **事务管理**:在进行多个数据库操作时,应包裹在同一个...

    使用hibernate封装方法

    在Java Web开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库与Java对象之间的交互。Struts是MVC(模型-视图-控制器)框架,用于处理HTTP请求,而JSP(JavaServer Pages)则用于创建动态网页。...

    Hibernate操作持久化对象

    Hibernate的核心在于提供对象-关系映射(ORM)服务,使得开发者能够以面向对象的方式来管理和操作数据库中的数据,从而减少了直接使用JDBC进行数据操作时的复杂性和错误。 为什么需要Hibernate? 在传统的JDBC编程中...

    封装好的hibernate数据库操作(增,删,改,查,分页)

    对hibernate的数据库操作封装: 1.分页查询 2.保存对象 3.保存对象组 4. 更新对象 5.更新对象组 6.保存或更新对象 7.保存或更新对象组 8. 删除对象 9. 删除对象组 10.删除对象(此类的所有对象) 11.删除(HQL) 12....

    Java封装hibernate操作数据库.rar

    本资料包"Java封装hibernate操作数据库.rar"主要涉及了如何使用Hibernate进行数据库操作,并通过DAO(Data Access Object)层的封装来实现更加高效、简洁的代码结构。 首先,让我们深入了解Hibernate。Hibernate是一...

    基于注解的springMVC+hibernate+oracle包含数据库查询

    在基于注解的SpringMVC中,控制器类、模型对象和视图解析都可以通过注解来定义,大大简化了配置文件。例如,`@Controller`注解标识一个类作为控制器,`@RequestMapping`注解用于映射URL到特定的方法,而`@Autowired`...

    maven搭建spring4+struts2+hibernate4项目demo含数据库

    本项目"maven搭建spring4+struts2+hibernate4项目demo含数据库"是一个典型的企业级应用开发实例,它利用Maven作为构建工具,Spring 4作为核心框架,Struts2作为控制器层,Hibernate4作为持久层,同时包含了数据库的...

    基于hibernate的简单数据库实现

    Hibernate提供了一种便捷的事务管理方式,可以将多个数据库操作封装在一个Transaction中,保证原子性和一致性。 通过以上内容,我们了解了Hibernate的基本操作和核心概念。在实际项目中,可以根据需求选择合适的...

    hibernate动态数据库改进版

    《Hibernate动态数据库改进版》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本篇文章将深入探讨如何利用Hibernate实现动态数据库操作,并结合具体的实例,介绍一个...

    hibernate所需包(数据库为mysql包)

    在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本压缩包包含了使用Hibernate与MySQL数据库交互所需的jar包,这些库文件是...

    类似hibernate的jdbc封装

    Hibernate是一个流行的Java对象关系映射(ORM)框架,它简化了数据库操作,将SQL语句与Java代码解耦,提供了面向对象的方式来处理数据。然而,有些场景下,我们可能并不需要完整的ORM功能,而是寻求一个轻量级的解决...

    hibernate封装.pdf

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式操作数据库,极大地简化了数据库操作。在提供的代码片段中,我们可以看到一个`HibernateDao`类,它是对Hibernate...

    hibernate环境搭建基本操作封装

    通过运行`Main`类,你可以看到如何使用封装后的操作来创建、查询、更新和删除User对象,从而验证你的Hibernate环境是否配置正确。 总之,搭建Hibernate环境并进行基本操作封装是Java开发中的常见任务。通过理解并...

    Hibernate配置数据库连接

    ### Hibernate配置数据库连接知识点详解 #### 一、Hibernate简介与作用 Hibernate 是一款开源的对象关系映射(Object Relational Mapping, ORM)框架,用于 Java 应用程序与关系型数据库之间的交互。它允许开发者以...

Global site tag (gtag.js) - Google Analytics