JPA按城市筛选公司时报错:Table 'localexpert.company_cities'不存在
解决JPA多对多关联表不存在异常
1. 修复多对多关联的中间表配置
JPA默认会为@ManyToMany关联自动生成中间表,但数据库中不存在该表时就会抛出Table doesn't exist异常。你需要明确指定中间表信息,或者让JPA自动创建它。
方式A:手动指定中间表(推荐用于已有数据库结构)
修改VisitorCompanyListCompanyEntity中的关联属性,添加@JoinTable注解定义中间表名称和关联字段:
@ManyToMany @JoinTable( name = "company_city", // 替换为你实际的中间表名称 joinColumns = @JoinColumn(name = "company_id"), // 关联company表的外键列 inverseJoinColumns = @JoinColumn(name = "city_id") // 关联city表的外键列 ) private List<VisitorCompanyListCityEntity> cities; @ManyToMany @JoinTable( name = "company_scope", joinColumns = @JoinColumn(name = "company_id"), inverseJoinColumns = @JoinColumn(name = "scope_id") ) private List<VisitorCompanyListScopeEntity> scopes; @ManyToMany @JoinTable( name = "company_service", joinColumns = @JoinColumn(name = "company_id"), inverseJoinColumns = @JoinColumn(name = "service_id") ) private List<VisitorCompanyListServiceEntity> services;
确保name的值与数据库中实际中间表名称一致,外键列名也匹配数据库字段。
方式B:让JPA自动创建中间表(适合开发环境)
在配置文件中添加Hibernate自动建表配置:
# application.properties spring.jpa.hibernate.ddl-auto=update
该配置会让Hibernate自动检查并创建缺失的表(包括中间表),但生产环境禁止使用,避免意外修改数据库结构。
2. 验证实体扫描范围
确保VisitorCompanyListCityEntity等实体被Spring Boot正确扫描:
- 实体类需放在主应用类(带
@SpringBootApplication注解)的子包下;若不在,需在主类中指定扫描范围:
@SpringBootApplication(scanBasePackages = "com.yourpackage") public class LocalExpertApplication { public static void main(String[] args) { SpringApplication.run(LocalExpertApplication.class, args); } }
或单独使用@EntityScan指定实体包:
@SpringBootApplication @EntityScan("com.yourpackage.entity") public class LocalExpertApplication { // ... }
3. 检查查询方法的正确性
仓库方法findAllByCitiesCityAndServicesNameAndScopesScope中:
CitiesCity是合法的,JPA会根据实体属性名解析(对应cities列表中VisitorCompanyListCityEntity的city属性,与数据库列名value无关);- 需确认
services关联的实体存在name属性、scopes关联的实体存在scope属性,否则会触发属性不存在异常。
4. 核对数据库结构
确认数据库中存在:
company主表city城市表- 对应中间表(如
company_city),需包含company_id和city_id外键列,分别关联company.id和city.id
若中间表缺失,可手动创建或通过方式B让JPA自动生成。
内容的提问来源于stack exchange,提问作者Mateusz Wołek
相关产品推荐
相关产品推荐

