有关返回集合的错误

有两个表,表一是记录病人退出资料,名字EXITMT;表二记录病人电子病历资料,名字EHRMT。两者是多对一的关联关系。

在EhrMt.hbm.xml映射文件中有如下代码:

<set inverse="true" lazy="true" name="exitMts">
<key column="EHR_ID" />
<one-to-many class="ExitMt" />
</set>

ExitMt.hbm.xml映射文件中有如下代码:

<many-to-one
name="ehr"
column="EHR_ID"
class="EhrMt"
not-null="true"
>
</many-to-one>
 
 

其中Set<ExitMt> set=mt.getExitMts();返回的set,其size=0!
而如果我加入以下代码:
Set<AdmissionHistoryMt> set1=mt.getAdmissionHistoryMts();
         System.err.println("返回set1 的size="+set1.size());
则返回的set1.size()=1;
也就是说,exitMts这个变量的定义有点问题?
 

要说明的是,mt数据类型为EhrMt,BaseEhrMt.java中有如下方法:

private java.util.Set<com.cdms.dataaccess.model.ExitMt> exitMts;
private java.util.Set<com.cdms.dataaccess.model.AdmissionHistoryMt> admissionHistoryMts;

    
/**
     * Return the value associated with the column: exitMts
     
*/

    
public java.util.Set<com.cdms.dataaccess.model.ExitMt> getExitMts () {
        
return exitMts;
    }


    
/**
     * Set the value related to the column: exitMts
     * 
@param exitMts the exitMts value
     
*/

    
public void setExitMts (java.util.Set<com.cdms.dataaccess.model.ExitMt> exitMts) {
        
this.exitMts = exitMts;
    }


    
public void addToexitMts (com.cdms.dataaccess.model.ExitMt exitMt) {
        
if (null == getExitMts()) setExitMts(new java.util.TreeSet<com.cdms.dataaccess.model.ExitMt>());
        getExitMts().add(exitMt);
    }


/**
     * Return the value associated with the column: admissionHistoryMts
     
*/

    
public java.util.Set<com.cdms.dataaccess.model.AdmissionHistoryMt> getAdmissionHistoryMts () {
        System.err.println(
"返回admissionHistoryMts="+admissionHistoryMts.size()+" "+admissionHistoryMts.isEmpty()+" "+admissionHistoryMts);
        
return admissionHistoryMts;
    }


    
/**
     * Set the value related to the column: admissionHistoryMts
     * 
@param admissionHistoryMts the admissionHistoryMts value
     
*/

    
public void setAdmissionHistoryMts (java.util.Set<com.cdms.dataaccess.model.AdmissionHistoryMt> admissionHistoryMts) {
        
this.admissionHistoryMts = admissionHistoryMts;
    }


    
public void addToadmissionHistoryMts (com.cdms.dataaccess.model.AdmissionHistoryMt admissionHistoryMt) {
        
if (null == getAdmissionHistoryMts()) setAdmissionHistoryMts(new java.util.TreeSet<com.cdms.dataaccess.model.AdmissionHistoryMt>());
        getAdmissionHistoryMts().add(admissionHistoryMt);
    }

 
为什么mt.size()=0呢?mt对象是没问题的,测试语句能够打印出正确的信息!
业务层分别对应ExitHistory.java以及Ehr.java.
 
有如下一段代码:
public ExitMt getExitMt(EhrMt ehr)
{
    Session s 
= DAOHelper.createNewSession();
    EHR e 
= (EHR) DAOHelper.load(EHR.class, ehr.getId(), s);
    EhrMt mt 
= (EhrMt) e.getTarget();

    
/* 测试mt对象 */
    System.err.println(
"mt.getAddress()="+mt.getAddress());
    System.err.println(
"mt.getBloodTypeCode()="+mt.getBloodTypeCode());
    System.err.println(
"mt..getExEhrNO()="+mt.getExEhrNO());

    Set
<ExitMt> set=mt.getExitMts();
    System.err.println(
"返回set 的size="+set.size());
    ExitMt em
=null;
    List
<ExitMt> list=null;
    
try
    
{
        
for (Iterator iter = set.iterator(); iter.hasNext();)
        
{
            list.add((ExitMt)iter.next());            
        }

    }

    
catch(Exception ex)
    
{
        ex.printStackTrace();
    }

    em
=list.get(0);
    System.err.println(
"返回em="+em);
    DAOHelper.closeSession(s);
    
return em;    
}
 
在使用 `List` 集合进行操作时,返回错误信息的原因通常与数据结构的不可变性、类型不匹配或内存管理相关。以下是常见的几种错误及其解决方案: ### 类型不可哈希导致的错误 当尝试将不可哈希的类型(如列表)用作字典的键或集合的元素时,会引发 `TypeError`。例如,试图将一个列表作为另一个列表的元素放入集合中会导致错误,因为列表是可变类型,而集合要求其元素必须是不可变且可哈希的。 ```python # 错误示例:将列表作为集合元素 my_set = set([[1, 2], [3, 4]]) # TypeError: unhashable type: 'list' ``` **解决方案**: - 将内部列表转换为元组,因为元组是不可变的,因此可以被哈希。 ```python # 正确示例:将元组作为集合元素 my_set = set([(1, 2), (3, 4)]) # 成功创建集合 ``` ### 同步化列表的操作异常 在并发环境中,如果多个线程同时修改同一个列表,可能会导致 `ConcurrentModificationException` 或其他未定义行为。Java 中提供了 `Collections.synchronizedList` 方法来包装一个列表,使其成为同步的,从而保证线程安全。 ```java // Java 示例:使用 Collections.synchronizedList 创建同步列表 List<String> syncList = Collections.synchronizedList(new ArrayList<>()); ``` **解决方案**: - 使用 `Collections.synchronizedList` 来确保线程安全。 - 在迭代过程中避免对列表进行结构性修改,或者使用支持并发修改的容器类,如 `CopyOnWriteArrayList`。 ### 内存泄漏问题 即使调用了 `list.clear()` 方法清空了列表,但如果列表中的对象仍然被其他地方引用,则这些对象不会被垃圾回收器回收,这可能导致内存泄漏。 ```csharp // C# 示例:清空列表但对象仍被外部引用 List<LargeObject> bigList = new List<LargeObject>(); for (int i = 0; i < 1000; i++) { bigList.Add(new LargeObject()); // 添加1000个大对象 } bigList.Clear(); // 清空列表,但如果外部有变量引用其中某个对象,这些对象仍无法回收! ``` **解决方案**: - 确保不再需要的对象的所有引用都被显式设置为 `null`,以便垃圾回收器能够回收它们。 - 定期检查和优化程序中的对象生命周期管理,减少不必要的长期持有对象的引用。 ### 相关问题 1. 如何判断一个对象是否可以作为字典的键? 2. 在多线程环境下,除了使用 `Collections.synchronizedList`,还有哪些方法可以保证列表的线程安全? 3. 如何有效地检测并解决 Java 或 C# 应用中的内存泄漏问题? 4. 如果在 Python 中需要存储包含列表的数据结构,有哪些替代方案? 5. 在处理大型对象集合时,除了清空列表外,还有哪些最佳实践可以帮助释放内存?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值