不同的java对象引用相同的内存地址异常解决方案
来源:互联网 发布:java 报表 编辑:程序博客网 时间:2024/05/20 05:58
1、首先数据库查询有四条记录:
显然这样输出的不同对象在内存中也是引用不同的地址了。
查询视图:select * from tav_user_dept_role where USER_TITLE = '罗可扬';返回结果:
那么也就对应了4个不同的对象。
2、实际操作中并非如此,返回了4对对象,但是却都引用了同一个内存地址:
List userInfoList = swfBiz.getTaViewUserDeptRoleList(user);TaViewUserDeptRole taViewUserDeptRole0 = (TaViewUserDeptRole)userInfoList.get(0); TaViewUserDeptRole taViewUserDeptRole1 = (TaViewUserDeptRole)userInfoList.get(1); TaViewUserDeptRole taViewUserDeptRole2 = (TaViewUserDeptRole)userInfoList.get(2); TaViewUserDeptRole taViewUserDeptRole3 = (TaViewUserDeptRole)userInfoList.get(3); System.out.println("taViewUserDeptRole0--->"+taViewUserDeptRole0+" taViewUserDeptRole0---->"+taViewUserDeptRole0.getDeptName()); System.out.println("taViewUserDeptRole1--->"+taViewUserDeptRole1+" taViewUserDeptRole1---->"+taViewUserDeptRole1.getDeptName()); System.out.println("taViewUserDeptRole2--->"+taViewUserDeptRole2+" taViewUserDeptRole2---->"+taViewUserDeptRole2.getDeptName()); System.out.println("taViewUserDeptRole3--->"+taViewUserDeptRole3+" taViewUserDeptRole3---->"+taViewUserDeptRole3.getDeptName());控制台打印结果:
控制台打印输出:taViewUserDeptRole0--->adam.bp.workflow.entity.TaViewUserDeptRole@111ebb3 taViewUserDeptRole0---->江南营业所taViewUserDeptRole1--->adam.bp.workflow.entity.TaViewUserDeptRole@111ebb3 taViewUserDeptRole1---->江南营业所taViewUserDeptRole2--->adam.bp.workflow.entity.TaViewUserDeptRole@111ebb3 taViewUserDeptRole2---->江南营业所taViewUserDeptRole3--->adam.bp.workflow.entity.TaViewUserDeptRole@111ebb3 taViewUserDeptRole3---->江南营业所四个对象的内存引用均为:adam.bp.workflow.entity.TaViewUserDeptRole@111ebb3。
显然出现了异常情况,但是控制台并没有报出任何异常。
3、发现问题
经过研究发现,问题出在了我的hibernate配置上,在利用hibernate反向生成视图 tav_user_dept_role对应的实体类时,本来是以联合主键的方式生成了两个类:TaViewUserDeptRole 和TaViewUserDeptRoleId。将所有的属性字段都放在了TaViewUserDeptRoleId中,然后通过TaViewUserDeptRole 的属性TaViewUserDeptRoleId调用。
我感觉不爽,直接干掉了。把所有的属性都移到了TaViewUserDeptRole 类中,并指定了一个主键:
配置如下:TaViewUserDeptRole.hbm.xml
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse - Hibernate Tools--><hibernate-mapping> <class name="adam.bp.workflow.entity.TaViewUserDeptRole" table="TAV_USER_DEPT_ROLE" schema="JMJL"> <id name="userName" type="string"> <column name="USER_NAME" length="21" /><generator class="native"></generator></id> <property name="userTitle" type="string"> <column name="USER_TITLE" length="30" /> </property> <property name="deptId" type="string"> <column name="DEPT_ID" length="39" /> </property> <property name="deptName" type="string"> <column name="DEPT_NAME" length="40" /> </property> <property name="roleName" type="string"> <column name="ROLE_NAME" length="21" /> </property> <property name="roleTitle" type="string"> <column name="ROLE_TITLE" length="30" /> </property> </class></hibernate-mapping>这样的修改便是导致问题的原因了!
4、解决问题
通过hibernate反向重新生成实体类:TaViewUserDeptRole_new和TaViewUserDeptRole_newId。
如下配置TaViewUserDeptRole_new.hbm.xml:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse - Hibernate Tools--><hibernate-mapping> <class name="adam.bp.workflow.entity.TaViewUserDeptRole_new" table="TAV_USER_DEPT_ROLE" schema="JMJL"> <composite-id name="id" class="adam.bp.workflow.entity.TaViewUserDeptRole_newId"> <key-property name="userName" type="string"> <column name="USER_NAME" length="21" /> </key-property> <key-property name="userTitle" type="string"> <column name="USER_TITLE" length="30" /> </key-property> <key-property name="deptId" type="string"> <column name="DEPT_ID" length="39" /> </key-property> <key-property name="deptName" type="string"> <column name="DEPT_NAME" length="40" /> </key-property> <key-property name="roleName" type="string"> <column name="ROLE_NAME" length="21" /> </key-property> <key-property name="roleTitle" type="string"> <column name="ROLE_TITLE" length="30" /> </key-property> </composite-id> </class></hibernate-mapping>
重新查找:
List userInfoList = swfBiz.getTaViewUserDeptRole_newList(user);TaViewUserDeptRole_new taViewUserDeptRole0 = (TaViewUserDeptRole_new)userInfoList.get(0); TaViewUserDeptRole_new taViewUserDeptRole1 = (TaViewUserDeptRole_new)userInfoList.get(1); TaViewUserDeptRole_new taViewUserDeptRole2 = (TaViewUserDeptRole_new)userInfoList.get(2); TaViewUserDeptRole_new taViewUserDeptRole3 = (TaViewUserDeptRole_new)userInfoList.get(3); System.out.println("taViewUserDeptRole0--->"+taViewUserDeptRole0+" taViewUserDeptRole0---->"+taViewUserDeptRole0.getId().getDeptName()); System.out.println("taViewUserDeptRole1--->"+taViewUserDeptRole1+" taViewUserDeptRole1---->"+taViewUserDeptRole1.getId().getDeptName()); System.out.println("taViewUserDeptRole2--->"+taViewUserDeptRole2+" taViewUserDeptRole2---->"+taViewUserDeptRole2.getId().getDeptName()); System.out.println("taViewUserDeptRole3--->"+taViewUserDeptRole3+" taViewUserDeptRole3---->"+taViewUserDeptRole3.getId().getDeptName());控制台打印输出:
taViewUserDeptRole0--->adam.bp.workflow.entity.TaViewUserDeptRole_new@38f07b taViewUserDeptRole0---->江南营业所taViewUserDeptRole1--->adam.bp.workflow.entity.TaViewUserDeptRole_new@3459ed taViewUserDeptRole1---->江南营业所taViewUserDeptRole2--->adam.bp.workflow.entity.TaViewUserDeptRole_new@fbef54 taViewUserDeptRole2---->恩平供电局taViewUserDeptRole3--->adam.bp.workflow.entity.TaViewUserDeptRole_new@1d9313 taViewUserDeptRole3---->恩平供电局
显然这样输出的不同对象在内存中也是引用不同的地址了。
- 不同的java对象引用相同的内存地址异常解决方案
- Flex 不同前端界面传递相同对象,ASObject 第一次转换正常,第二次转换异常的解决方案
- 按内存地址区分不同的对象
- 对java对象的地址引用及值引用
- Java打印对象的内存地址
- Java中相同类名不同package名的类的引用
- Java 内存泄露以及几种不同的引用
- js对象的地址引用
- 异常 :不同的包有相同的类
- 引用和指针的地址是相同的!
- Java与CSharp的相同与不同
- Java 查找两个有复杂对象的集合中的不同元素和相同的元素
- Java比较两个对象是否相同并获得不同的字段
- 7.22相同类的不同对象执行相同成员函数输出不同结果
- 获取对象的内存地址
- Android 相同类,相同包,在不同的jar/aar中,指定引用一个
- HIBERNATE两个相同的标识符挂不同对象的解决
- Java对象的引用
- C#控件及常用设计整理
- 分享200个免费的倒影效果移动设备及网站图标下载
- MFC制作双缓冲无闪烁的字幕滚动条
- 扩展jQuery函数功能
- 杂记
- 不同的java对象引用相同的内存地址异常解决方案
- 第七周 1-1
- 你真的很了解HTML标签吗? 试试这个超异类的HTML标签小测验吧!
- 分享32款令人惊叹的文字信息图
- ruby + tk 是快速GUI开发的终极解决之道吗?
- Signal: 最民主,真实,及时的公众新闻应用
- 自定义标签 (Taglib) 续一
- CrackZ的文章:FLEXlm--愚人的商业许可证管理器
- ruby使用推荐文章