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

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日