weixin_57804238 2024-04-16 16:41 采纳率: 0%
浏览 7
已结题

identifier of an instance of 类 was altered from xx to xx错误

做一个考勤系统,统计员工在每个项目上的考勤信息,在编辑的时候更改员工所在项目时报错identifier of an instance of com.viva.quantum.model.biz.Project was altered from 26 to 22; nested exception is org.hibernate.HibernateException: identifier of an instance of com.viva.quantum.model.biz.Project was altered from 26 to 22,搜了一下说通过查询得到的结果不能修改主键或者外键什么的,但不知道该怎么修改,请各位大神指教一下

img

  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-16 16:42
    关注

    引自免费微信小程序:皆我百晓生

    针对您所描述的问题,即在编辑员工考勤信息时,当更改员工所在项目时出现“identifier of an instance of com.viva.quantum.model.biz.Project was altered from 26 to 22”错误,这通常表示您试图修改一个实体(这里是Project类的实例)的主键(ID)。在关系型数据库及Hibernate ORM框架中,主键是用于唯一标识一条记录的关键字段,一般不允许被修改。

    根据您提供的代码片段,错误可能出现在以下几行:

    Project oldProject = obj.getProject();
    // ...
    Project p = obj.getProject();
    

    您尝试更新objDutyDt对象)中的Project关联,并在后续代码中对Project及其相关数据进行调整。为解决此问题,您可以遵循以下步骤进行代码调整:

    1. 分离项目变更逻辑:将项目变更操作与员工考勤信息更新分开处理。先处理项目变更,然后再更新员工考勤信息。这样可以避免在保存考勤信息时直接修改Project实体的主键。

    2. 使用项目ID进行关联:在更新员工考勤信息时,仅更改与项目关联的ID,而非整个Project实体。这样,Hibernate就不会尝试修改Project实体的主键。

    以下是修改后的示例代码:

    @RequestMapping(value = @v"Lid)/edit", method = RequestMethod.POST)
    public java.lang.String processUpdateOwnerForm(@Valid DutyDt obj, BindingResult result, Map<java.lang.String, Object> model, @PathVariable("id") int id) {
        if (result.hasErrors()) {
            return getJspPath() + "/createOrUpdate";
        } else {
            obj.setId(id);
            
            // 获取当前项目ID和新选择的项目ID
            int oldProjectId = obj.getProject().getId();
            int newProjectId = // ... 从请求参数或表单中获取新的项目ID
    
            // 更新员工考勤信息中的项目关联
            obj.setProjectId(newProjectId);
    
            this.getRepository().saveAndFlush(obj);
    
            // 处理项目工作日统计变更
            ProjectPlan oldPlan = projectPlanReposity.findByDeletedAndProject_Id(b: false, oldProjectId);
            ProjectPlan newPlan = projectPlanReposity.findByDeletedAndProject_Id(b: false, newProjectId);
    
            // 根据obj.getStat()计算工作日增减并更新相应ProjectPlan
            // ...(此处省略原有逻辑)
    
            projectPlanReposity.saveAndFlush(oldPlan);
            projectPlanReposity.saveAndFlush(newPlan);
    
            model.put("id", id);
            model.put("obj", obj);
            return "redirect:" + getNameSpace() + "/" + obj.getId();
        }
    }
    

    请注意,上述代码示例假设您有一个setProjectId(int projectId)方法用于设置DutyDt对象中与项目关联的ID。同时,您需要从请求参数或表单中获取用户选择的新项目ID(newProjectId),并将其用于更新obj

    通过以上修改,您应该能避免直接修改Project实体的主键,从而解决报错问题。如果您还有其他疑问或需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月17日
  • 创建了问题 4月16日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题