引自免费微信小程序:皆我百晓生
针对您所描述的问题,即在编辑员工考勤信息时,当更改员工所在项目时出现“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();
您尝试更新obj(DutyDt对象)中的Project关联,并在后续代码中对Project及其相关数据进行调整。为解决此问题,您可以遵循以下步骤进行代码调整:
-
分离项目变更逻辑:将项目变更操作与员工考勤信息更新分开处理。先处理项目变更,然后再更新员工考勤信息。这样可以避免在保存考勤信息时直接修改Project实体的主键。
-
使用项目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实体的主键,从而解决报错问题。如果您还有其他疑问或需要进一步的帮助,请随时告诉我。