【问题标题】:j.l.IllegalArgumentException: Not a managed typej.l.IllegalArgumentException:不是托管类型
【发布时间】:2020-08-17 12:28:07
【问题描述】:

我使用的是Spring boot+JPA,启动应用时遇到问题。

{"@timestamp":"2020-08-17T14:51:10.837+03:00","loglevel":"ERROR","thread_id":"main","service":"le-migration-service","class":"org.springframework.boot.SpringApplication","message":"Application run failed","stack_trace":"j.l.IllegalArgumentException: Not a managed type: class ro.raiffeisen.athena.lemigration.domain.entity.aibas.ValidAibasProducts
at o.h.m.i.MetamodelImpl.managedType(MetamodelImpl.java:582)
at o.h.m.i.MetamodelImpl.managedType(MetamodelImpl.java:85)\r\n\tat o.s.d.j.r.s.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:74)
at o.s.d.j.r.s.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66)
at o.s.d.j.r.s.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:211)
at o.s.d.j.r.s.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:161)
at o.s.d.j.r.s.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:144)at o.s.d.j.r.s.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:69)
at o.s.d.r.c.s.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:312)
at o.s.d.r.c.s.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297)
at o.s.data.util.Lazy.getNullable(Lazy.java:212)
at o.s.data.util.Lazy.get(Lazy.java:94)
at o.s.d.r.c.s.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300)
at o.s.d.j.r.s.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:121)
at o.s.b.f.s.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
at o.s.b.f.s.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
... 44 common frames omitted
Wrapped by: o.s.b.f.BeanCreationException: Error creating bean with name 'aibasRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class ro.raiffeisen.athena.lemigration.domain.entity.aibas.ValidAibasProducts
tat o.s.b.f.s.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
at o.s.b.f.s.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFac...
"}

我有一个看起来像这样的“实体”。它实际上是一个没有实体注释的简单 POJO,因为我试图将 oracle sql 连接的结果映射到非实体 java 类。连接将返回我试图在“integrationIdList”字段中放入“ValidAibasProducts”类的字符串列表。

@MappedSuperclass
@Data
@SqlResultSetMapping(
        name="ValidAibasProducts",
        classes={
                @ConstructorResult(
                        targetClass=ValidAibasProducts.class,
                        columns={
                                @ColumnResult(name="integrationIdList")
                        }
                )
        }
)
@NamedNativeQuery(name="ValidAibasProducts", query="select t1.integration_id from ocrm_stg.s_org_ext t1 inner join ocrm_stg.s_asset t2 on t2.owner_accnt_id = t1.row_id where t2.prod_id in ('P-8JIA79', 'P-8JIA5Y') and t2.status_cd = 'Active'", resultSetMapping="ValidAibasProducts")

public class ValidAibasProducts {

    private List<String> integrationIdList;
}

存储库如下所示:

@Repository
public interface AibasRepository extends JpaRepository<ValidAibasProducts, String> {

    List<String> getValidAibasProducts();
}

配置类如下所示:

@Configuration
@EnableJpaRepositories(basePackages = "//path to the repository",
        entityManagerFactoryRef = "aibasEntityManagerFactory",
        transactionManagerRef = "aibasTransactionManager"
)
public class AibasJpaBeansConfig {

    @Bean
    @ConfigurationProperties(prefix = "aibas.jpa")
    public JpaProperties aibasJpaProperties() {
        return new JpaProperties();
    }

    @Bean
    @ConfigurationProperties(prefix = "aibas.datasource")
    public DataSource aibasDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean aibasEntityManagerFactory(
            final EntityManagerFactoryBuilder builder,
            @Qualifier("aibasDataSource") final DataSource aibasDataSource,
            @Qualifier("aibasJpaProperties") final JpaProperties aibasJpaProperties) {

        return builder
                .dataSource(aibasDataSource)
                .packages("//path to the entity")
                .persistenceUnit("aibas")
                .properties(aibasJpaProperties.getProperties())
                .build();
    }

    @Bean
    public PlatformTransactionManager aibasTransactionManager(
            @Qualifier("aibasEntityManagerFactory") final EntityManagerFactory aibasEntityManagerFactory) {
        return new JpaTransactionManager(aibasEntityManagerFactory);
    }

}

我还想提一下,我对此进行了一些研究并尝试了不同的解决方案,例如在配置文件中添加注释 @EntityScan("//path to the entity package");或者尝试直接在存储库接口中查询连接,而不是使用@SqlResultSetMapping。

它们都不起作用。

目标是我可以以某种方式将字符串列表保存在内存中,以便在开发中进一步使用它。任何帮助将不胜感激。

【问题讨论】:

    标签: java spring spring-boot jpa


    【解决方案1】:

    如果您倾向于将查询结果映射到非实体对象,您可以简单地使用jpa Projection。创建一个接口 ValidAibasProducts 与 相关属性方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2015-04-24
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      相关资源
      最近更新 更多