Spring Data JPA多对多关联报错:Invalid object name 'employee_project'
排查JPA多对多关联找不到中间表的问题
问题根源分析
你遇到的Invalid object name 'employee_project'异常,本质是Hibernate在生成SQL时用了默认的中间表名(规则是两个实体类名小写加下划线,也就是employee_project),但没识别到你在Project类里通过@JoinTable指定的EmployeeProject表名,导致和数据库实际存在的表不匹配。
可能的解决方案
1. 修复实体类字段的访问权限与Getter/Setter
你的Project类中workers字段是包级私有(没加访问修饰符),而且没提供对应的Getter/Setter方法,这可能让Hibernate无法正确读取字段上的@JoinTable注解。
修改Project类,给字段加上private修饰符并补充Getter/Setter:
@Entity @Table(name = "Project") public class Project { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "PROJECT_ID_PK") private int projectIdPk; @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE }) @JoinTable(name = "EmployeeProject", joinColumns = { @JoinColumn(name = "PROJECT_ID_PK") }, inverseJoinColumns = { @JoinColumn(name = "EMPLOYEE_ID_PK") }) private Collection<Employee> workers = new HashSet<Employee>(0); // 添加Getter和Setter public Collection<Employee> getWorkers() { return workers; } public void setWorkers(Collection<Employee> workers) { this.workers = workers; } }
2. 调整Hibernate命名策略配置
Spring Boot默认的SpringPhysicalNamingStrategy会把驼峰命名的表名/列名转成下划线分隔的小写格式(比如EmployeeProject会被转为employee_project),如果你的数据库表名是EmployeeProject,就会出现不匹配。
有三种解决方式:
- 方式一:修改命名策略
在application.properties里配置Hibernate使用标准命名策略,不做自动转换:spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl - 方式二:强制指定表名(加双引号)
在@JoinTable和@JoinColumn里用双引号包裹名称,避免被命名策略转换:@JoinTable(name = "\"EmployeeProject\"", joinColumns = { @JoinColumn(name = "\"PROJECT_ID_PK\"") }, inverseJoinColumns = { @JoinColumn(name = "\"EMPLOYEE_ID_PK\"") }) - 方式三:修改数据库表名
把中间表重命名为employee_project,和Hibernate默认生成的名称保持一致。
3. 验证数据库中间表结构
确认数据库里的EmployeeProject表:
- 表名完全匹配(注意SQL Server的大小写规则,默认不区分,但如果数据库启用了区分大小写排序规则,必须严格一致)
- 包含
PROJECT_ID_PK和EMPLOYEE_ID_PK两个外键列,分别关联Project.PROJECT_ID_PK和Employee.EMPLOYEE_ID_PK
测试验证
修改完成后重启服务,再次调用project.getWorkers(),Hibernate应该会正确访问EmployeeProject表,不会再抛出找不到表的异常。
内容的提问来源于stack exchange,提问作者Sabin Antohe
相关产品推荐
相关产品推荐

