首页 > 解决方案 > Spring Boot:为什么在使用多个数据源时未在 createQuery 中扫描实体?

问题描述

我正在使用 Spring Boot 2.3.0。我有 2 个数据源,一个用于 oracle,一个用于在 application.properties 中定义的 h2。我必须@Configuration为数据配置提供 2 个类。两个类都实现:

LocalContainerEntityManagerFactoryBean我设置:

应用程序正常启动,我什至可以.findAll对 H2 数据库中的表执行操作,但是一旦我开始在存储库实现中执行自定义方法,例如:

@Transactional(readOnly = true)
private Optional<List<Foo>> findFooByState(Optional<Integer> id, Foo.State state) {
CriteriaBuilder cp = em.getCriteriaBuilder();
CriteriaQuery<Foo> cqFoo= cp.createQuery(Foo.class);
Root<Foo> fooRoot = cqFoo.from(Foo.class);
[...]

Spring 抛出异常,例如:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
[Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Not an entity: class foo.Foo;
nested exception is java.lang.IllegalArgumentException: Not an entity: class foo.Foo] with root cause

正如我之前写的那样,foo添加了包。setPackagesToScan我已经尝试了各种方法@Transactional,例如删除它,添加其中指定的事务管理器的名称DataSource,将 移动@Transactional@GetMapping,但没有任何帮助。

有人知道我在做什么错吗?谢谢,

标签: spring-bootjpadatasource

解决方案


我有一个类似的问题。很可能您还没有配置 JPA 存储库基础包来为不同的数据源选择不同的实体。您可以查看我的指南,了解如何 在 Spring Boot 应用程序中配置两个数据源。希望它会有所帮助!


推荐阅读