我有多个数据源配置,我正在尝试使用辅助数据库的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?
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();
}
}