ssm配置开发一对一查出多条数据再getset异常
数据库存了这个文件id,dao层通过一对一查询出来的这个FileInfoParam存放在HistoryOperateDetailVO中,然后我循环获取evidence_message,通过json转换成FileInfoParam中的evidence,并set进去。但是发现,我set有evidence_message数据的FileInfoParam实体时,没有的evidence_message数据的另一个也被set进去了。也就是说这两个实体HistoryOperateDetailVO中的FileInfoParam实体属性是指向同一个地址,类似与深拷贝和浅拷贝。然后就有如下的操作。
废话不说直接上代码,
原来:
List<HistoryOperateDetailVO> historyOperateDetailVOS = historyOperateMapper.getHistoryOperateDetailById(id, AuditProjectConst.AUDIT);
if (!CollectionUtils.isEmpty(historyOperateDetailVOS)) {//组装带有凭证的挽损表和登记表
for (int i = 0; i < historyOperateDetailVOS.size(); i++) {
if (historyOperateDetailVOS.get(i).getEvidenceMessage() != null && !"".equals(historyOperateDetailVOS.get(i).getEvidenceMessage())) {
List<AuditDocEvidenceVO> auditDocEvidenceVOS = JSONObject.parseArray(historyOperateDetailVOS.get(i).getEvidenceMessage(), AuditDocEvidenceVO.class);
if (!CollectionUtils.isEmpty(auditDocEvidenceVOS)) {
historyOperateDetailVOS.get(i).getFileInfoParam().setAuditDocEvidenceBVOS(auditDocEvidenceVOS);
historyOperateDetailVOS.get(i).setEvidenceMessage(null);
}
}
}
}
System.out.println(historyOperateDetailVOS);
return historyOperateDetailVOS;
}
注意将实体HistoryOperateDetailVO和FileInfoParam继承implements Serializable
新
@Override
public List<HistoryOperateDetailVO> getHistoryOperateDetailById(String id) {
List<HistoryOperateDetailVO> historyOperateDetailVOS = historyOperateMapper.getHistoryOperateDetailById(id, AuditProjectConst.AUDIT);
if (!CollectionUtils.isEmpty(historyOperateDetailVOS)) {//组装带有凭证的挽损表和登记表
//新添加
historyOperateDetailVOS.forEach(vo -> {
if (vo.getFileInfoParam() != null) {//处理同一个对象的时候返回的结果
FileInfoParam fileInfoParam = SerializationUtils.clone(vo.getFileInfoParam());
vo.setFileInfoParam(fileInfoParam);
}
});
for (int i = 0; i < historyOperateDetailVOS.size(); i++) {
if (historyOperateDetailVOS.get(i).getEvidenceMessage() != null && !"".equals(historyOperateDetailVOS.get(i).getEvidenceMessage())) {
List<AuditDocEvidenceVO> auditDocEvidenceVOS = JSONObject.parseArray(historyOperateDetailVOS.get(i).getEvidenceMessage(), AuditDocEvidenceVO.class);
if (!CollectionUtils.isEmpty(auditDocEvidenceVOS)) {
historyOperateDetailVOS.get(i).getFileInfoParam().setAuditDocEvidenceBVOS(auditDocEvidenceVOS);
historyOperateDetailVOS.get(i).setEvidenceMessage(null);
}
}
}
}
System.out.println(historyOperateDetailVOS);
return historyOperateDetailVOS;
}
剩余是vo
/**
* 操作记录详情
**/
@Data
public class HistoryOperateDetailVO implements Serializable {
//主键
private String historyOperateId;
....
//操作记录中-挽损表,登记表及凭证(如果上传的时候有的话)信息
private FileInfoParam fileInfoParam;
}
/**
* 操作记录中-挽损表,登记表信息
**/
@Data
public class FileInfoParam implements Serializable {
// 文件信息表主键
private String id;
.......
//凭证集合
private List<AuditDocEvidenceVO> auditDocEvidenceBVOS;