使用关联查询直接获得hibernate封装实体对象,通过set方法修改该实体对象,修改后的实体对象新增/更新到数据库时报错异常。
查阅问题相关blog了解,Hibernate中bean对象被划分为四个状态:瞬时态、持久态、托管态、游离态
关于“hibernate的四个状态及转换”相关文章
https://blog.csdn.net/Jintao_Ma/article/details/51199490
解决办法:
在新增或更新之前,将目标对象复制一份,再对复制的对象进行save或update操作,这样每个对象在内存中就一定不会是同一个地址了。
- 修改前
List<PaperEntity> paperEntityList = paperService.findPaperByPaperId(paperId);//paperId(String)
//省略对paperEntityList“判空”代码
PaperEntity paperEntity = paperEntityList.get(0);//获取持久态对象
paperEntity.setId(“id_new”);
paperService.save(paperEntity);//新对象持久化操作
- 修改后
List<PaperEntity> paperEntityList = paperService.findPaperByPaperId(paperId);//paperId(String)
//省略对paperEntityList“判空”代码
PaperEntity paperEntity = paperEntityList.get(0);//获取持久态对象
PaperEntity paper = new PaperEntity();//创建新对象
BeanUtils.copyProperties(paperEntity,paper);//复制新对象(paperEntity-->paper)
paper.setId(“id_new”);
paperService.save(paper);//新对象持久化操作
顺带一提(踩坑):
不同包的copyProperties方法,用法稍有差别!
BeanUtils.copyProperties(A,B)字段复制
https://blog.csdn.net/yangschfly/article/details/68490325