Spring微服务六边形架构下HQL查询H2报ActivityEntity未映射问题
问题修复方案
核心原因1:HQL查询实体名与声明不匹配
你在ActivityEntity类的@Entity注解中显式设置了name = "N_ACTIVITY",该属性的作用就是指定HQL/JPQL查询时使用的实体识别名称,你当前HQL语句中使用ActivityEntity作为查询对象,自然无法匹配到映射关系。
两种修复方案选其一即可:
- 方案1:直接修改HQL语句,使用你声明的实体名:
Query query = entityManager.createQuery("SELECT a FROM N_ACTIVITY a");
- 方案2:调整实体注解配置,区分数表名和实体名:
@Data @EqualsAndHashCode(callSuper = true) // 继承父类时必须加,否则父类属性不会参与equals、hashCode计算 @ToString(callSuper = true) @Entity // 不指定name属性时,实体名默认就是类名ActivityEntity @Table(name = "N_ACTIVITY") // 用@Table注解单独指定数据库表名 public class ActivityEntity extends NomenclatureEntity { }
核心原因2:Repository配置不规范
你的NomenclatureSpringDataRepository继承CrudRepository时,泛型指定的是NomenclatureEntity,但该类标注了@MappedSuperclass,仅作为实体公共属性的父类,本身不属于可被JPA管理的实体类,会导致相关子类的映射识别异常。
修复方案:
为每个实际的业务实体单独创建对应的Repository,比如ActivityEntity对应的Repository:
@Repository public interface ActivitySpringDataRepository extends CrudRepository<ActivityEntity, Long> { }
可选补充配置
如果上述修复完成后仍有映射错误,可在启动类上显式指定实体扫描路径,避免多模块架构下扫描不到实体的问题:
@SpringBootApplication(exclude={SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class}) @Import(value = MyApplicationConfig.class) @EntityScan(basePackages = "com.package.company.infrastructure.repository.jpa.entity") // 显式指定实体类所在包路径 public class MyApplication { // 原有代码保持不变 }
内容的提问来源于stack exchange,提问作者Ousmane MBINTE
相关产品推荐
相关产品推荐

