问题代码:
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());