JPA Schema校验curr_step字段类型不匹配问题排查咨询
问题根因
这个类型不匹配报错是JPA关联配置和数据库实际结构不一致导致的:
- 你在
risk_workflow对应的实体中给currentStep字段配置了@ManyToOne关联,没有指定referencedColumnName的情况下,框架默认会拿关联实体WorkflowTaskRoleMapping的主键作为外键的预期类型 - 从
WorkflowTaskRoleMapping的代码看,它的主键id是long类型,对应数据库类型为number(19,0) (Types#BIGINT),但实际数据库里risk_workflow表的CURR_STEP列是varchar2字符串类型,schema校验阶段两边类型对不上就会直接抛错。
解决方案
根据实际业务场景二选一即可:
- 场景1:curr_step字段本来就应该存储关联表的主键ID
属于数据库字段结构建错,直接执行SQL修改risk_workflow表的curr_step列类型为number(19,0),和框架预期类型对齐,重启后校验就会通过。如果之前开了Hibernate自动DDL生成了错误的字段结构,修改后建议把自动DDL配置调整为validate,避免后续再生成错误结构。 - 场景2:curr_step字段实际存储的是关联表的字符串类型字段(比如任务名、角色编码这类非主键字段)
属于实体关联配置缺参数导致的问题,需要在@JoinColumn注解中明确指定referencedColumnName,声明外键实际关联的是对方表的哪个字段,例如如果关联的是WorkflowTaskRoleMapping的TASK_NAME字段,代码修改如下:
注意:被关联的字段必须在@ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "CURR_STEP", referencedColumnName = "TASK_NAME") private WorkflowTaskRoleMapping currentStep;WorkflowTaskRoleMapping实体中存在对应映射,且数据库对应列需要加唯一约束,否则会出现关联查询结果错乱的问题。
内容的提问来源于stack exchange,提问作者Sanat Chandravanshi
相关产品推荐
相关产品推荐

