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 异常是 Java 开发中经常遇到的问题,本文档将提供 Java 异常解决方案,涵盖 Hibernate、Tomcat、Java 基本、JSP、SSH 整合等多个方面的异常解决方案。 一、Hibernate 异常解决方案 * org.hibernate....
本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. **内存溢出类型** - **1.1. java.lang.OutOfMemoryError: PermGen space** PermGen空间是JVM用于存储类元数据和常量池的部分,不会被垃圾收集器自动...
因此,了解Java内存泄漏的成因、检测方法以及解决方案对于保证应用的高效稳定运行至关重要。 #### 2. Java内存回收机制 Java的内存管理主要集中在堆(Heap)区域,其中对象的创建通常是通过`new`关键字或反射方式...
4. 使用弱引用和软引用:Java 提供了 WeakReference 和 SoftReference,这些引用类型的对象在 GC 需要回收内存时会被自动清除,有助于防止内存泄漏。 5. 监控系统指标:通过监控 JVM 的内存使用情况,如堆内存、非...
### Java内存泄漏解决方案详解 #### 一、Java内存泄漏概述 在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地...
### Java常见错误及解决方案 #### 1. 类定义未找到错误 `java.lang.NoClassDefFoundError` **原因分析** - **程序调用的JAVA类文件未正确上传:** 当程序试图加载一个不存在或未正确部署的类时,会出现此类错误。 ...
- 分析应用代码,查找是否有长时间保留对象引用的情况,特别是注意循环引用等问题。 - 在开发过程中尽量避免使用过多的大对象或大数组,定期清理不再使用的对象。 3. **处理永久代(PermGen)空间溢出**: - 对于...
- **解决方案**:针对不同的问题,可以采取相应的解决措施,如增加堆外内存大小、减少线程数量等。 #### 五、硬件限制与操作系统角色 在深入理解Java内存机制之前,我们需要了解底层硬件和操作系统的限制。 **...
当Java对象引用了本地资源,例如DLL中的对象,而这些引用没有被正确释放时,就会发生内存泄漏。以下是一些可能导致内存泄漏的常见原因: 1. **本地引用未释放**:在JNI方法中创建的本地对象,如果在Java层没有对应...
总结,Java系统中的内存泄漏测试和分析涉及多个方面,包括理解内存管理机制、识别泄漏原因、使用专业工具以及制定有效的解决方案。开发者应当养成良好的编程习惯,注重代码质量,以减少内存泄漏的发生。同时,利用...
### 内存泄漏及解决方案 #### 一、内存泄漏定义 内存泄漏是指程序在申请内存后,因未能正常释放导致这部分内存无法再次被利用的现象。简单来说,就是指那些不再被程序使用的对象或数据仍然占据着内存空间,使得这...
本文将详细介绍几种Java中常见的异常类型及其产生原因,并提供相应的解决方案。 #### 二、异常类型详解 ##### 1. NullPointerException (空指针异常) **定义:** `NullPointerException`是最常见的运行时异常之一...
下面将深入探讨在Java基础测试中常见的异常问题及其解决方案,尤其关注那些在执行基本Java程序时可能遇到的异常情况。 ### 1. "java' is not recognized as an internal or external command 这种情况通常发生在...
《Java开发常见错误及解决方案文件》是一份指导Java开发者避免和处理开发过程中常见问题的文档。该文档中提到了一些典型的错误和对应的解决方案,下面详细展开其中的一些关键知识点。 1. 类定义未找到错误(java....
- 及时释放不再使用的对象引用,以便垃圾回收器能够尽快回收内存。 - 使用弱引用、软引用或虚引用来替代强引用,以提高内存管理的灵活性。 3. **使用工具进行监控和分析** - 利用JVisualVM、VisualGC等工具实时...
### 内存溢出及其解决方案 #### 一、内存溢出概述 内存溢出是指程序在运行过程中,因持续申请内存资源而导致系统无法满足其内存需求的现象。这通常发生在资源管理不当的情况下,例如未能及时释放不再使用的内存...
- 解决方案:使用`try-catch-finally`语句块,避免使用`catch (Exception e)`,针对不同类型的异常采取不同的处理策略。 6. **死锁(Deadlock)** - 原因:多个线程互相等待对方释放资源,形成循环等待。 - 解决...
关注长期增长的对象、异常大的对象或异常多的相同类型对象,这些可能是内存泄露的信号。 6. **代码审查**:检查代码中是否存在可能导致内存泄露的常见模式,如静态集合类中的元素、大对象的长时间缓存、未关闭的I/O...