`
Java_Fan
  • 浏览: 81770 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

不同的java对象引用相同的内存地址异常解决方案

 
阅读更多

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异常解决方案.docx

    Java 异常是 Java 开发中经常遇到的问题,本文档将提供 Java 异常解决方案,涵盖 Hibernate、Tomcat、Java 基本、JSP、SSH 整合等多个方面的异常解决方案。 一、Hibernate 异常解决方案 * org.hibernate....

    java内存溢出解决方案

    本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. **内存溢出类型** - **1.1. java.lang.OutOfMemoryError: PermGen space** PermGen空间是JVM用于存储类元数据和常量池的部分,不会被垃圾收集器自动...

    如何解决Java内存泄漏

    因此,了解Java内存泄漏的成因、检测方法以及解决方案对于保证应用的高效稳定运行至关重要。 #### 2. Java内存回收机制 Java的内存管理主要集中在堆(Heap)区域,其中对象的创建通常是通过`new`关键字或反射方式...

    防范JAVA内存泄漏解决方案

    4. 使用弱引用和软引用:Java 提供了 WeakReference 和 SoftReference,这些引用类型的对象在 GC 需要回收内存时会被自动清除,有助于防止内存泄漏。 5. 监控系统指标:通过监控 JVM 的内存使用情况,如堆内存、非...

    java内存泄漏解决

    ### Java内存泄漏解决方案详解 #### 一、Java内存泄漏概述 在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地...

    Java常见错误及解决方案

    ### Java常见错误及解决方案 #### 1. 类定义未找到错误 `java.lang.NoClassDefFoundError` **原因分析** - **程序调用的JAVA类文件未正确上传:** 当程序试图加载一个不存在或未正确部署的类时,会出现此类错误。 ...

    系统内存不足引起异常的解决方法

    - 分析应用代码,查找是否有长时间保留对象引用的情况,特别是注意循环引用等问题。 - 在开发过程中尽量避免使用过多的大对象或大数组,定期清理不再使用的对象。 3. **处理永久代(PermGen)空间溢出**: - 对于...

    Java内存机制学习和使用

    - **解决方案**:针对不同的问题,可以采取相应的解决措施,如增加堆外内存大小、减少线程数量等。 #### 五、硬件限制与操作系统角色 在深入理解Java内存机制之前,我们需要了解底层硬件和操作系统的限制。 **...

    Java加载dll,导致Java进程内存泄露

    当Java对象引用了本地资源,例如DLL中的对象,而这些引用没有被正确释放时,就会发生内存泄漏。以下是一些可能导致内存泄漏的常见原因: 1. **本地引用未释放**:在JNI方法中创建的本地对象,如果在Java层没有对应...

    Java系统中内存泄漏测试方法的研究

    总结,Java系统中的内存泄漏测试和分析涉及多个方面,包括理解内存管理机制、识别泄漏原因、使用专业工具以及制定有效的解决方案。开发者应当养成良好的编程习惯,注重代码质量,以减少内存泄漏的发生。同时,利用...

    内存泄漏及解决方案.docx

    ### 内存泄漏及解决方案 #### 一、内存泄漏定义 内存泄漏是指程序在申请内存后,因未能正常释放导致这部分内存无法再次被利用的现象。简单来说,就是指那些不再被程序使用的对象或数据仍然占据着内存空间,使得这...

    Java中常见异常类型及分析.pdf

    本文将详细介绍几种Java中常见的异常类型及其产生原因,并提供相应的解决方案。 #### 二、异常类型详解 ##### 1. NullPointerException (空指针异常) **定义:** `NullPointerException`是最常见的运行时异常之一...

    JAVA基础测试中常见的异常问题汇总

    下面将深入探讨在Java基础测试中常见的异常问题及其解决方案,尤其关注那些在执行基本Java程序时可能遇到的异常情况。 ### 1. "java' is not recognized as an internal or external command 这种情况通常发生在...

    Java开发常见错误及解决方案文件

    《Java开发常见错误及解决方案文件》是一份指导Java开发者避免和处理开发过程中常见问题的文档。该文档中提到了一些典型的错误和对应的解决方案,下面详细展开其中的一些关键知识点。 1. 类定义未找到错误(java....

    解决Java_heap_space问题

    - 及时释放不再使用的对象引用,以便垃圾回收器能够尽快回收内存。 - 使用弱引用、软引用或虚引用来替代强引用,以提高内存管理的灵活性。 3. **使用工具进行监控和分析** - 利用JVisualVM、VisualGC等工具实时...

    内存溢出及解决方案.docx

    ### 内存溢出及其解决方案 #### 一、内存溢出概述 内存溢出是指程序在运行过程中,因持续申请内存资源而导致系统无法满足其内存需求的现象。这通常发生在资源管理不当的情况下,例如未能及时释放不再使用的内存...

    java开发常遇问题和解决

    - 解决方案:使用`try-catch-finally`语句块,避免使用`catch (Exception e)`,针对不同类型的异常采取不同的处理策略。 6. **死锁(Deadlock)** - 原因:多个线程互相等待对方释放资源,形成循环等待。 - 解决...

    java内存泄露定位与分析共13页.pdf.zip

    关注长期增长的对象、异常大的对象或异常多的相同类型对象,这些可能是内存泄露的信号。 6. **代码审查**:检查代码中是否存在可能导致内存泄露的常见模式,如静态集合类中的元素、大对象的长时间缓存、未关闭的I/O...

Global site tag (gtag.js) - Google Analytics