Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
来源:互联网 发布:安卓变声软件 编辑:程序博客网 时间:2024/06/06 02:16
Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
- 博客分类:
- Hibernate
HibernateSQLJDBC
Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
今天在用hibernate对视图进行查询时,对于返回的list,发现里面所有对象都是同一个对象,连地址都是一样的,
但把查询语句放到PL/SQL中查询,结果如下:
实体对象的Hibernate配置片段如下:
除了table="V_OUTSRC4_DEMANDCERT" 是视图外..别的没有任何特别的地方,id随便生成就可以了.因为是视图,用来查询的,id就随便了.
java代码片段如下:
代码运行的结果如下:
可见.list中的三个对象,都是一样的.
这是什么原因呢?
其实很简单,因为hibernate配置文件上,我这个实体的主键是ID字段,而我的视图,ID并不能作为唯一标识,所以,当hibernate查数据库的第一条纪录的时候,就生成了一个
Os4VDemandCert对象,放在持久对象池里,
当再去查第二条纪录的时候,hibernate发现第二条纪录的ID和持久池里那第一条纪录的ID是一样的,所以就不重复生成新的对象了,直接拿持久池里原有的那个对象放到list中去,第三条纪录也一样.
这样,就导致list中的3个对象都是一样的结果.
这个跟Override了对象的hashCode和equals方法没有关系.
要解决上面的问题.可以用JDBC,或者在Hibernate上给对象配置联合主键来避免..
今天在用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来映射数据库中的视图的时候,先注意下一视图是不是有唯一字段,如果有,就拿能唯一标识一条纪录的那个字段来作为主键,或许用联合主键.
from: http://t8500071.iteye.com/blog/344193
0 0
- Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
- Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
- 如何解决返回数据库查询纪录条数的…
- 用hibernate 多表联合查询时每条记录返回的都是个对象数组
- 取查询纪录的第一条纪录
- oracle 数据库随机返回查询纪录
- 我们都是一样的
- 运用数据库查询语句并且返回查询出来返回的查询条数
- mybatise查询返回的一个集合封装多个对象的实现
- 关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】
- 结果都是一样的java
- iOS:手机横屏时,按下横屏视图上的导航条“返回”按钮后,切换为另一个竖屏视图
- 关于返回上一级视图后视图中tableview内容不刷新的问题
- 关于返回上一级视图后视图中tableview内容不刷新的问题
- Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)
- 数据库的查询与视图
- sql查询案例:删除2条完全一样的数据
- 查询某个纪录的所有父类的纪录!
- 小白学opengl之显示回调函数与reshape回调函数
- amfphp资料
- 贪心算法的思想
- smartform实现分页
- vim中的命令
- Hibernate2查询视图时,数据库返回多条纪录,封装后的对象却都是一样的问题
- 我的博客今天开通啦
- 实例化,执行,初始化,销毁bean对象
- 北邮VHDL数电实验—电子沙漏
- 算法导论------------栈(stack)简单的数组实现
- 贪心算法思想
- Java中字节流和字符流之间的转换
- window.onunload, window.onbeforunload
- Hibernate 4.3.x 注解常见错误及解决方案