具有 2 个数据库配置的 Spring 引导 - 使用第二个配置延迟加载不起作用



我有 2 个数据库配置的 Spring 引导项目。

主数据库配置:

@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);
    }
} 

和次要:

@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);
    }
}

有一个实体加载了第二个数据库:

@Entity
@Table(name = "users")
public class User {
    @OneToMany(mappedBy = "user")
    private List<Company> companies;

用:

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

当我使用 UserRepository 时,User 被检索,但当我点击加载公司时,我得到com.sun.jdi.InvocationException occurred invoking method. - com.sun.jdi.InvocationException 发生调用方法。如果我将SecondaryDbConfig更改为@Primary或添加fetch = FetchType.EAGER则按预期检索公司。我尝试添加@Transactional(transactionManager="secondaryTransactionManager")但没有帮助。

我错过了什么?使用非主数据库配置时延迟加载实体属性的正确方法是什么?

我已经通过在类中添加@Transactional来解决此问题@Service。

我遇到了类似的问题。要启用具有多个数据库的 JPA 实体的延迟装入,您需要为 DBConfig 类中的每个数据库创建单独的 OpenEntityManagerInViewFilter bean。我在这里找到了解决方案:弹簧启动-JPA-多个数据源在上面的文章中搜索术语"懒惰"。

尝试将@Transactional添加到检索公司列表的@Service方法或控制器中。

祝你好运!

最新更新