如何从多个数据源配置中使用特定的EntityManagerFactory

问题描述 投票:0回答:1

我有多个数据源配置,我正在尝试使用辅助数据库的EntityManagerFactory。 目前,在调用 EntityManagerFactory 时,它仅通过检索错误“不是实体”来引用主数据库配置。 这是我的配置:

应用程序属性

spring.ds.datasource1.url=jdbc:postgresql:x
spring.ds.datasource1.username=user
spring.ds.datasource1.password=

spring.ds.datasource2.url=jdbc:postgresql:x
spring.ds.datasource2.username=user
spring.ds.datasource2.password=

数据源1配置:

@EnableJpaRepositories(basePackages = "eu.example", entityManagerFactoryRef = "ds1EntityManagerFactory", transactionManagerRef = "ds1TransactionManager")
@Configuration
public class Ds1DataSourceConfiguration {

    private static final String DS1_ENTITY_MANAGER_FACTORY = "ds1EntityManagerFactory";
    private static final String DS1_TRANSACTION_MANAGER = "ds1TransactionManager";

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.ds.datasource1")
    public DataSourceProperties ds1DataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean
    @ConfigurationProperties("spring.ds.datasource1")
    public DataSource ds1DataSource(DataSourceProperties properties) {
        return properties
                .initializeDataSourceBuilder()
                .build();
    }

    @Primary
    @Bean(name = DS1_ENTITY_MANAGER_FACTORY)
    public LocalContainerEntityManagerFactoryBean ds1EntityManagerFactoryBean(
            EntityManagerFactoryBuilder factoryBuilder, DataSource ds1Ds) {
        return factoryBuilder
                .dataSource(ds1Ds)
                .packages("eu.example.domain.entity.ds1")
                .build();
    }

    @Primary
    @Bean(name = DS1_TRANSACTION_MANAGER)
    public PlatformTransactionManager ds1TransactionManager(
            @Qualifier(DS1_ENTITY_MANAGER_FACTORY) LocalContainerEntityManagerFactoryBean managerFactoryBean) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(managerFactoryBean.getObject());
        return jpaTransactionManager;
    }

}

数据源2配置与上面的配置类似,没有Primary注释

服务等级:

@Service
public class TestService{

    private final EntityManagerFactory et2;
    
    ...

}

如何在不使用持久性单元的情况下将 Service 类中的 et2 引用到 Datasource 2 EntityManagerFactory?

java spring-boot jpa entitymanager
1个回答
0
投票

请参考EntityManager链接

EntityManager 实例与持久化上下文关联。持久化上下文是一组实体实例,其中对于任何持久化实体标识,都有一个唯一的实体实例。在持久化上下文中,管理实体实例及其生命周期。 EntityManager API 用于创建和删除持久实体实例、通过主键查找实体以及查询实体。

您的配置看起来不错。请参考这个 github 存储库链接

我们可以在服务层定义实体、存储库和调用。

实体:

package eu.example.domain.entity.ds1.model;
@Entity
public class Customer implements Serializable {
// getter setters
}

存储库:

package eu.example.domain.entity.ds1.repository;
@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {}

服务:

package eu.example.domain.entity.ds1.service;
@Service
public class CustomerServiceImpl implements CustomerService {

    @Autowired
    CustomerRepository customerRepository;

    @Override
    public List<ClientSetting> findClientDataSourceSettings() {

        return customerRepository.findAll();
    }

}

替代方案

@Repository
public class CustomerInfoRepository {

    @Autowired
    @Qualifier("ds1EntityManagerFactoryBean")
    private EntityManager entityManager;

    public List<Customer> getCustomerInfo() {

        Query query = entityManager.createNativeQuery(....);
        return  query.getResultList();

    }

    @Transactional("ds1TransactionManager")
    public void updateCustomerInfo(String name, Long id) {
        Query query = entityManager.createQuery(....);
         query.executeUpdate();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.