我有两个Postgres数据库和一个SpringBoot应用程序。我连接到每个数据库,并成功地对每个数据库执行单独的事务。只要我一直在我的辅助数据库上使用普通的查询,它就能正常工作。
小学: powwow
一旦我尝试在二级(pims)数据库上执行原生查询,它就会认为它正在查看主数据库( at )。
例如,这个“商人”表位于二级数据库(Pims)上:
PSQLException:错误:关系“商人”不存在
如果我运行相同的本机查询,但在主数据库中的一个表上运行,它可以正常工作。因此,我认为我的配置中存在一个问题,我定义了第二个数据源(pims)。
如果我使用com.xxxx.powwow.entities.pims
包中的存储库在二级(pims)数据库上运行一个非本机查询,它就能正常工作。
问题
如何使用com.xxxx.powwow.dao.pims
包中的dao执行本机查询?
PersistencePimsAutoConfiguration.java
@Configuration
@PropertySource({"classpath:application.properties"})
@EnableJpaRepositories(
basePackages = {"com.xxxx.powwow.dao.pims", "com.xxxx.powwow.repositories.pims"},
entityManagerFactoryRef = "pimsEntityManager",
transactionManagerRef = "pimsTransactionManager")
public class PersistencePimsAutoConfiguration {
private Logger logger = LogManager.getLogger(PersistencePimsAutoConfiguration.class);
@Value("${spring.datasource1.jdbc-url}")
private String url;
@Value("${spring.datasource1.username}")
private String username;
@Value("${spring.jpa.hibernate.ddl-auto}")
private String hbm2ddl;
@Value("${spring.jpa.database-platform}")
private String platform;
@Value("${spring.jpa.properties.hibernate.dialect}")
private String dialect;
@Value("${spring.profiles.active}")
private String profile;
@Bean
@ConfigurationProperties(prefix="spring.datasource1")
public DataSource pimsDataSource() {
return DataSourceBuilder.create().build();
}
//@Bean(name = "pimsEntityManager")
@Bean
public LocalContainerEntityManagerFactoryBean pimsEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(pimsDataSource());
em.setPackagesToScan(new String[] {"com.xxxx.powwow.entities.pims"});
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", hbm2ddl);
properties.put("hibernate.dialect", dialect);
em.setJpaPropertyMap(properties);
String host = null;
try {
host = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
logger.info("Setting spring.datasource1 (pims): hibernate.hbm2ddl.auto='"+hbm2ddl+"', platform='"+platform+"', url='"+url+"', username='"+username+"', host='"+host+"', profile='"+profile+"'.");
return em;
}
@Bean
public PlatformTransactionManager pimsTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(pimsEntityManager().getObject());
return transactionManager;
}
}
BookingHistoryReportDao.java (包com.xxxx.powwow.dao.pims
)
@Component
@Transactional("pimsTransactionManager")
public class BookingHistoryReportDao {
private Logger logger = LogManager.getLogger(BookingHistoryReportDao.class);
@PersistenceContext
private EntityManager entityManager;
public void executeBookingHistoryReport(Date startDate, Date endDate, List<Integer> companyIds) {
final String sql = getSQLBookingHistoryReportDao();
try {
Query qry = entityManager.createNativeQuery(sql);
List<String> merchants = qry.getResultList();
logger.info("done");
} catch (Exception e) {
logger.error("Error executing query for BookingHistoryReport.", e);
logger.info(sql);
}
}
private String getSQLBookingHistoryReportDao() {
return "select company_name from Merchants limit 100";
}
}
发布于 2022-11-02 08:29:57
通过使用PersistenceUnitName
,我成功地完成了这个任务。
例如:
在配置中设置它:
em.setPersistenceUnitName("pimsPersistenceUnit");
并在“DAO”中提及:
@PersistenceContext(unitName = "pimsPersistenceUnit")
private EntityManager entityManager;
https://stackoverflow.com/questions/74275198
复制相似问题