如何解决j.l.IllegalArgumentException:不是托管类型
我使用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(“ //到实体包的路径”);或尝试直接在存储库界面中查询联接,而不使用@SqlResultSetMapping。
他们都没有工作。
目标是我可以以某种方式将String列表保存在内存中,以便在开发中进一步使用它。任何帮助将不胜感激。
解决方法
如果您倾向于将查询结果映射到非实体对象,则可以简单地使用jpa Projection
。使用创建接口ValidAibasProducts
相关属性方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。