list.addAll()在hibernate中的问题

问题代码:

for (FsscJoaffMain joaffMain : joaffMainList) {
    SysOrgPerson acTraveler = joaffMain.getFdActraveler();
    Map<String, List<FsscJoaffSubsidyDetail>> subsidyDetailMap = new HashMap<String, List<FsscJoaffSubsidyDetail>>();
    if(!subsidyDetailMap.containsKey(acTraveler.getFdId())){
        subsidyDetailMap.put(acTraveler.getFdId(), joaffMain.getFdSubsidyDetail());
    }else {
        subsidyDetailMap.get(acTraveler.getFdId()).addAll(joaffMain.getFdSubsidyDetail());
    }
}
//注:joaffMain.getFdSubsidyDetail()等于FsscJoaffSubsidyDetail;
//FsscJoaffSubsidyDetail.docMain等于FsscJoaffMain;
//第二个的FsscJoaffMain中的FsscJoaffSubsidyDetail的docMain字段会变成第一个FsscJoaffMain的fdId;
//相应的数据库层面会执行对应sql语句。

代码分析:

list.addAll();list.all();list.clear()均存在该类问题:list 如果是Hibernate的明细, list.add/clear/addAll   这些操作都会触发 sql操作的.

list.addAll()方法将一个list中的数据加入到另一个list中时,list中数据都是同样的数据类型不同的对象;hibernate会对第一个list中的对象进行删除操作,另一个执行了addAll方法的list会执行增加操作,即第一个list中的对象在数据库中执行delete操作。

例如上面代码,第一次循环【第一个FsscJoaffMain对象】会往subsidyDetailMap中存入“joaffMain.getFdSubsidyDetail()”对象的list数据,第二次循环【第二个FsscJoaffMain对象】走else时,会将第二个对象的明细list加入到第一个明细list,如果是hibernate,则同时会将第一个对象的明细list增加数据,而第二个list对象明细数据会被清空。

解决方案:

循环体中换成这样的代码就可以解决上述问题:

if(!subsidyDetailMap.containsKey(acTraveler.getFdId())){
    subsidyDetailMap.put(acTraveler.getFdId(), new ArrayList<FsscJoaffSubsidyDetail>());
}
subsidyDetailMap.get(acTraveler.getFdId()).addAll(joaffMain.getFdSubsidyDetail());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值