【问题标题】:Spring Boot: Why isn't entity being scanned in createQuery when using multiple datasources?Spring Boot:为什么在使用多个数据源时未在 createQuery 中扫描实体?
【发布时间】:2020-11-13 23:29:17
【问题描述】:

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

  • DataSource
  • PlatformTransactionManager
  • LocalContainerEntityManagerFactoryBean

LocalContainerEntityManagerFactoryBean我设置:

  • setDataSource
  • setPackagesToScan
  • setJpaVendorAdapter

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

@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-boot jpa datasource


    【解决方案1】:

    好吧,我很瘸子。我不得不:

    1. setPersistenceUnitNameLocalContainerEntityManagerFactoryBean 实例化方法中
    2. 我必须使用正确的@PersistenceContext 和正确的unitName

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题。很可能您还没有配置 JPA 存储库基础包来为不同的数据源选择不同的实体。你可以看看我的guide on how to configure two data sources 在 Spring Boot 应用程序中。希望对您有所帮助!

      【讨论】:

      • 感谢您的提示,但是添加了软件包,真正的问题是存储库的 persistencecontext 配置。无论如何谢谢!
      猜你喜欢
      • 2019-08-17
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多