当前位置: 首页 > 知识库问答 >
问题:

带有多个数据源的Spring Boot+Camel JPA

咸正平
2023-03-14

我需要创建一个Camel路由,它轮询一个数据库,转换检索到的数据,然后将新实体插入另一个数据库。我需要帮助配置。

from("jpa://" + Entity1.class.getName()
            + "?"
            + "persistenceUnit=entity1PU&"
            + "consumer.namedQuery=query1&"
            + "consumeDelete=false"
            )
        //various operations... 
        .to("direct:route2");

from("direct:route2")
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                //processing...
            }
        })
        .to("jpa://" + Entity2.class.getName()
                + "?"
                + "persistenceUnit=entity2PU&"
                + "entityType=java.util.ArrayList&"
                + "usePersist=true&"
                + "flushOnSend=true");
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = "com.foo.entity1.repo", 
    entityManagerFactoryRef = "entity1EntityManagerFactory",
    transactionManagerRef = "entity1TransactionManager"
)
public class Entity1PersistenceConfig {

    @Autowired
    @Qualifier("datasource1")
    private DataSource dataSource;

    @Primary
    public DataSource dataSource() {
        return this.dataSource;
    }

    @Primary
    @Bean(name="entity1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();      
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.foo.entity1.domain");
        factory.setDataSource(this.dataSource());

        factory.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        factory.setPersistenceUnitName("entity1PU");

        Properties hibernateProps = setJpaHibernateCommonProperties();
        hibernateProps.setProperty("hibernate.dialect", environment.getProperty("spring.jpa.properties.hibernate.oracle.dialect"));
        factory.setJpaProperties(hibernateProps);
        return factory;
    }

    @Primary
    @Bean(name="entity1TransactionManager")
    public PlatformTransactionManager transactionManager() {

        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

        return jpaTransactionManager;       
    }
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    basePackages = "com.foo.entity2.repo", 
    entityManagerFactoryRef = "entity2EntityManagerFactory",
    transactionManagerRef = "entity2TransactionManager"
)
public class Entity2PersistenceConfig {

    @Autowired
    @Qualifier("datasource2")
    private DataSource dataSource;

    public DataSource dataSource() {
        return this.dataSource;
    }

    @Bean(name="entity2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();      
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.foo.entity2.domain");
        factory.setDataSource(this.dataSource());

        factory.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        factory.setPersistenceUnitName("entity2PU");

        Properties hibernateProps = setJpaHibernateCommonProperties();
        hibernateProps.setProperty("hibernate.dialect", environment.getProperty("spring.jpa.properties.hibernate.mysql.dialect"));
        factory.setJpaProperties(hibernateProps);
        return factory;
    }

    @Bean(name="entity2TransactionManager")
    public PlatformTransactionManager transactionManager() {

        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

        return jpaTransactionManager;       
    }
}
2018-05-30 11:38:36.481  INFO 1056 --- [main] o.h.j.b.internal.PersistenceXmlParser: HHH000318: Could not find any META-INF/persistence.xml file in the classpath
 javax.persistence.PersistenceException: No Persistence provider for EntityManager named entity1PU
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61) ~[hibernate-jpa-2.1-api-1.0.0.Final.jar:1.0.0.Final]
at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:96) ~[spring-orm-4.3.17.RELEASE.jar:4.3.17.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384) ~[spring-orm-4.3.17.RELEASE.jar:4.3.17.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371) ~[spring-orm-4.3.17.RELEASE.jar:4.3.17.RELEASE]
at org.apache.camel.component.jpa.JpaEndpoint.createEntityManagerFactory(JpaEndpoint.java:552) ~[camel-jpa-2.21.1.jar:2.21.1]
at org.apache.camel.component.jpa.JpaEndpoint.getEntityManagerFactory(JpaEndpoint.java:250) ~[camel-jpa-2.21.1.jar:2.21.1]
at org.apache.camel.component.jpa.JpaEndpoint.validate(JpaEndpoint.java:545) ~[camel-jpa-2.21.1.jar:2.21.1]
at org.apache.camel.component.jpa.JpaEndpoint.createConsumer(JpaEndpoint.java:165) ~[camel-jpa-2.21.1.jar:2.21.1]
at org.apache.camel.impl.EventDrivenConsumerRoute.addServices(EventDrivenConsumerRoute.java:69) ~[camel-core-2.21.1.jar:2.21.1]
at org.apache.camel.impl.DefaultRoute.onStartingServices(DefaultRoute.java:103) ~[camel-core-2.21.1.jar:2.21.1]
at org.apache.camel.impl.RouteService.doWarmUp(RouteService.java:172) ~[camel-core-2.21.1.jar:2.21.1]
at org.apache.camel.impl.RouteService.warmUp(RouteService.java:145) ~[camel-core-2.21.1.jar:2.21.1]

为什么它要寻找persistence.xml文件而不是使用注释?我使用的是Spring Boot1.5.13,与Camel 2.21.1一起发布。

共有1个答案

东门晟
2023-03-14

基本上,为了使它工作,我必须放弃使用注释,创建一个等效的persistence.xml文件,因为Apache Camel只在其中查找配置。

一旦我可以升级到Spring Boot2(因为Apache Camel得到了更新并开始支持它),我就设法通过注释进行了配置,并删除了persistence.xml文件。

 类似资料:
  • 问题内容: 这是我正在尝试使用Spring Data JPA实现类似解决方案的代码。 CustomerDbConfig.java(第一个数据源连接) CustomerDbConfig.java(第二个数据源) Order.java(模型) … CustomerRepository.java 最后,Application.java 在启动过程中会引发以下异常: 预先感谢你的帮助。 问题答案: 通过使

  • 我正在尝试使用两个数据源与我的SpringBoot应用程序,但无法获得第二个数据源自动连接。我尝试过很多事情,但这是我最接近的一次: 我的Yaml文件: 这是我到目前为止最接近的一次。我之所以说它是最接近的,是因为如果我删除@qualifier,那么我的两个dao方法实际上都可以工作,假设SECOND_SELECT语句对于我的DB1是有效的SQL语句。当我为非主datasouce输入@Qualif

  • 我在Spring Boot中有两个MySQL数据源,因此我有两个配置类。但它似乎只使用主数据源。所有实体都是为主数据源创建的,因此crawlerdb和userdb实体都是在userdb中创建的。 我的userdb主配置: 我的辅助爬网数据库配置: 两个架构的实体类位于不同的包中,如类名上方的EntityScan所示。但当我检查MySQL workbench中创建的模式时,我看到所有实体都是在use

  • 我正在尝试在Heroku上部署我的Quarkus-app。它工作正常,但我需要使用固定值指定数据源参数。因为Heroku可能会旋转此参数,所以这不是一个真正的好主意。 在Quarkus中,我需要应用程序中的这3个参数。属性: Heroku只给了我1个环境变量(

  • 我有一个简单的Spring引导应用程序与2个外部罐子。每个jar都使用Spring JPA,并且完全配置为独立工作。 JAR1 这是我的Spring Boot应用程序的启动类 服务器启动时没有任何问题,但在配置jpa内容时存在一些问题。持久性单元ais的配置应使用Oracle方言和驱动程序。看来它拿起了JAR1的配置。 下一个问题是数据库访问。Spring不知道应该使用哪个事务管理器

  • 本文向大家介绍springboot + mybatis配置多数据源示例,包括了springboot + mybatis配置多数据源示例的使用技巧和注意事项,需要的朋友参考一下 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源。 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseContextHolder是一个线