Spring Boot JPA配置一对多关系后MySQL外键无法更新问题咨询
问题修复方案
1. 修复双向关联的维护逻辑(核心导致外键为空的原因)
你使用的是双向@OneToMany映射,mappedBy = "userEntities"指定了由Contact实体的userEntities属性维护外键关联。你当前只把Contact加到User的联系人列表里,没有给Contact对象设置所属的User对象,所以外键不会被赋值。
在控制器的processContact方法中,添加联系人到列表之后,加一行代码:
contactEntitie.setUserEntities(userEntities);
2. 修复实体类的错误
- Contact实体的
@JoinColumn命名建议调整,避免混淆,将@JoinColumn(name = "contact_id")改为@JoinColumn(name = "user_id"),明确该字段是关联用户表的外键 - 修正Contact实体主键set方法的类型不匹配问题:把
public void setC_id(int c_id)的参数改为long类型:public void setC_id(long c_id) - 建议将Contact实体的主键生成策略和User统一,把
@GeneratedValue(strategy = GenerationType.AUTO)改为@GeneratedValue(strategy = GenerationType.IDENTITY)适配MySQL自增主键 - 修正User实体的方法名拼写错误:
getRoll/setRoll改为getRole/setRole,避免后续权限校验出错
3. 修复Repository泛型类型不匹配问题
两个Repository的主键泛型参数和实体主键类型不匹配,需要修改:
- ContactRepo:
JpaRepository<ContactEntities, Integer>改为JpaRepository<ContactEntities, Long> - UserRepository:
JpaRepository<UserEntities, Integer>改为JpaRepository<UserEntities, Long>
4. 修正application.properties的配置错误
- 方言拼写错误:
spring.jpa.properties.hibernate.dilact改为spring.jpa.properties.hibernate.dialect - 驱动类配置错误:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.NonRegisteringDriver改为spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
修复完所有问题后,先清空数据库中已生成的旧表,重启项目让Hibernate重新生成表结构,再测试添加联系人即可看到外键正常赋值。
内容的提问来源于stack exchange,提问作者Shykat Roy NDUDUgCyEt
相关产品推荐
相关产品推荐

