简体   繁体   English

Spring 使用 2 个数据库配置启动 - 使用第二个配置的延迟加载不起作用

[英]Spring Boot with 2 database configs - lazy loading with second config does not work

I have Spring Boot project with 2 database configs.我有 Spring 引导项目和 2 个数据库配置。

Primary DB config:主数据库配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(transactionManagerRef = "primaryTransactionManager", entityManagerFactoryRef = "primaryEntityManagerFactory", basePackages = { "com.example.repository.primary" })
public class PrimaryDbConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.primary.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "primaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,         @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.domain.primary").persistenceUnit("primary-persistence-unit").build();
    }

    @Primary
    @Bean(name = "primaryTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
} 

And secondary:次要的:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager", basePackages = { "com.example.repository.secondary" })
public class SecondaryDbConfig {

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.secondary.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder,         @Qualifier("secondaryDataSource") DataSource dataSource) {
        return builder.dataSource(dataSource).packages("com.example.domain.secondary").persistenceUnit("secondary-persistence-unit").build();
    }

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

There is entity which is loaded with second DB:有一个实体加载了第二个数据库:

@Entity
@Table(name = "users")
public class User {

    @OneToMany(mappedBy = "user")
    private List<Company> companies;

Using:使用:

public interface UserRepository extends JpaRepository<User, Long> {
    User findByEmail(String email);
}

When I use UserRepository , User is retrieved but when I hit to load companies, I get com.sun.jdi.InvocationException occurred invoking method.当我使用UserRepository时,会检索到User ,但是当我点击加载公司时,我得到com.sun.jdi.InvocationException occurred invoking method. - com.sun.jdi.InvocationException occurred invoking method . - com.sun.jdi.InvocationException 发生调用方法 If I change SecondaryDbConfig to @Primary or add fetch = FetchType.EAGER then companies are retrieved as expected.如果我将SecondaryDbConfig更改为@Primary或添加fetch = FetchType.EAGER ,则将按预期检索公司。 I have tried adding @Transactional(transactionManager="secondaryTransactionManager") but it didn't help.我尝试添加@Transactional(transactionManager="secondaryTransactionManager")但它没有帮助。

What did I miss?我错过了什么? What's the proper approach to lazy load entity properties when using not primary database config?使用非主数据库配置时延迟加载实体属性的正确方法是什么?

I have resolved this issue by adding @Transactional over @Service class.我通过在@Service class 上添加@Transactional 解决了这个问题。

I was facing a similar issue.我遇到了类似的问题。 To enable lazy loading of JPA entity with multiple databases, you need to create seperate OpenEntityManagerInViewFilter beans for each database in your DBConfig classes.要使用多个数据库启用 JPA 实体的延迟加载,您需要为 DBConfig 类中的每个数据库创建单独的 OpenEntityManagerInViewFilter bean。 I found the solution here: spring-boot-jpa-multiple-data-sources Search for the term "Lazy" in the article above.我在这里找到了解决方案: spring-boot-jpa-multiple-data-sources在上面的文章中搜索术语“Lazy”。

Try to add @Transactional to your @Service method(s) or controller which retrieved list of company. 尝试将@Transactional添加到您的@Service方法或检索公司列表的控制器中。

Good luck! 祝好运!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM