Hibernate的saveOrupdte方法报错a different object with the same identifier value was already

//发布公告时,有用户信息,修改公告没有传入用户信息
        public BaseOutVO addOrUpdateNotice(NoticeVo vo, UserInfo userInfo) {
        BaseOutVO baseOutVO = new BaseOutVO();
        Notice notice = new Notice();
        notice.setTitle(vo.getTitle());
        notice.setContent(vo.getContent());
        notice.setStartTime(UtilTime.StringToDate(vo.getStartTime(),"yyyy-MM-dd HH:mm:ss"));
        notice.setEndTime(UtilTime.StringToDate(vo.getEndTime(),"yyyy-MM-dd HH:mm:ss"));

        //发布公告时,有用户信息,修改公告没有传入用户信息
        if(userInfo !=null){
            notice.setCreateTime(UtilTime.StringToDate(UtilTime.getCurrentTime(),"yyyy-MM-dd HH:mm:ss"));
            notice.setCreater(userInfo.getUniqueId());
            baseOutVO.setMessage("发布成功");
        }
        if(userInfo !=null){
            notice.setCreateTime(UtilTime.StringToDate(UtilTime.getCurrentTime(),"yyyy-MM-dd HH:mm:ss"));
            notice.setCreater(userInfo.getUniqueId());
            baseOutVO.setMessage("发布成功");
        }else {
            //根据公告id查询出之前的公告,将createrid取出,放入要修改的公告对象里
            Notice former = noticeDao.get(Notice.class, vo.getUniqueId());
            notice.setCreater(former.getCreater());
            notice.setUniqueId(vo.getUniqueId());
            baseOutVO.setMessage("修改成功");
        }
        noticeDao.saveOrUpdate(notice);
        baseOutVO.setResult(true);
        return baseOutVO;
    }

错误的意思就是:在hibernate中同一个session里面有了两个相同标识但是是不同实体。
错误原因在于 调用hibernate的get方法取出对象,而调用saveOrupdate保存的对象是另一个,导致session里面有了两个相同标识但是是不同实体。
解决办法是:

public BaseOutVO addOrUpdateNotice(NoticeVo vo, UserInfo userInfo) {
        BaseOutVO baseOutVO = new BaseOutVO();
        Notice notice = new Notice();

        //发布公告时,有用户信息,修改公告没有传入用户信息
        if(userInfo !=null){
            notice.setCreateTime(UtilTime.StringToDate(UtilTime.getCurrentTime(),"yyyy-MM-dd HH:mm:ss"));
            notice.setCreater(userInfo.getUniqueId());
            baseOutVO.setMessage("发布成功");
        }else {
            notice = noticeDao.get(Notice.class, vo.getUniqueId());
            baseOutVO.setMessage("修改成功");
        }
        notice.setTitle(vo.getTitle());
        notice.setContent(vo.getContent());
        notice.setStartTime(UtilTime.StringToDate(vo.getStartTime(),"yyyy-MM-dd HH:mm:ss"));
        notice.setEndTime(UtilTime.StringToDate(vo.getEndTime(),"yyyy-MM-dd HH:mm:ss"));
        noticeDao.saveOrUpdate(notice);
        baseOutVO.setResult(true);
        return baseOutVO;
    }

把信息封装到从get方法取出来的对象里,保存这个取出的对象。这样的话同一个session里的对象标识只有一个实体(可能有其他解决办法)
参考的博客:https://blog.youkuaiyun.com/u012230055/article/details/40423903
https://blog.youkuaiyun.com/forsipphone/article/details/53838265

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值