首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring 2数据库JPA

Spring 2数据库JPA
EN

Stack Overflow用户
提问于 2022-11-01 11:26:40
回答 1查看 50关注 0票数 0

我有两个Postgres数据库和一个SpringBoot应用程序。我连接到每个数据库,并成功地对每个数据库执行单独的事务。只要我一直在我的辅助数据库上使用普通的查询,它就能正常工作。

小学: powwow

  • secondary: pims

一旦我尝试在二级(pims)数据库上执行原生查询,它就会认为它正在查看主数据库( at )。

例如,这个“商人”表位于二级数据库(Pims)上:

PSQLException:错误:关系“商人”不存在

如果我运行相同的本机查询,但在主数据库中的一个表上运行,它可以正常工作。因此,我认为我的配置中存在一个问题,我定义了第二个数据源(pims)。

如果我使用com.xxxx.powwow.entities.pims包中的存储库在二级(pims)数据库上运行一个非本机查询,它就能正常工作。

问题

如何使用com.xxxx.powwow.dao.pims包中的dao执行本机查询?

PersistencePimsAutoConfiguration.java

代码语言:javascript
运行
复制
@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)

代码语言:javascript
运行
复制
@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";
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-02 08:29:57

通过使用PersistenceUnitName,我成功地完成了这个任务。

例如:

在配置中设置它:

代码语言:javascript
运行
复制
em.setPersistenceUnitName("pimsPersistenceUnit");

并在“DAO”中提及:

代码语言:javascript
运行
复制
@PersistenceContext(unitName = "pimsPersistenceUnit")
private EntityManager entityManager;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74275198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档