淘先锋技术网

首页 1 2 3 4 5 6 7

使用关联查询直接获得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