Spring Boot + Camel JPA с несколькими источниками данных - PullRequest
0 голосов
/ 30 мая 2018

Мне нужно создать маршрут Camel, который опрашивает БД, преобразует извлеченные данные и затем вставляет новые объекты в другую БД.Мне нужна помощь с настройкой.

Это конечные точки jpa:

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");

Я бы хотел настроить единицы персистентности с помощью кода и аннотаций вместо использования файла persistence.xml;это относительные классы.Это первое:

@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 Boot 1.5.13.RELEASE с верблюдом 2.21.1.

1 Ответ

0 голосов
/ 22 августа 2018

В основном, чтобы это работало, мне пришлось отказаться от использования аннотаций и создать эквивалентный файл persistence.xml, потому что Apache Camel искал конфигурацию только в нем.

Как только я смог перейти на Spring Boot 2(поскольку Apache Camel был обновлен и начал поддерживать его), мне удалось настроить конфигурацию с помощью аннотаций и удалить файл persistence.xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...