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

Camel+Spring Boot+JPA,多个数据源未找到正确的持久化单元

施刚毅
2023-03-14

我有一个Spring Boot服务,使用JPA和Apache Camel。我在https://www.baeldung.com/spring-data-jpa-multiple-databases之后配置了两个不同的数据源,到目前为止,数据源本身似乎就位了。但是,camel并不是根据persistenceUnit的名称来选择它们。当我移除与其中一个数据源相关的所有代码时,它就会突然工作起来。对我来说,persistenceUnit名称似乎没有正确设置。我总是得到以下错误:

javax.Persistence.persistenceException:命名域的EntityManager没有持久性提供程序


import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
import java.util.HashMap;

@Configuration
@PropertySource({"classpath:database.properties"})
@EnableJpaRepositories(
        basePackages = {"com.myapp.persistence.domain"},
        entityManagerFactoryRef = "domainEntityManager",
        transactionManagerRef = "domainTransactionManager")
public class PersistenceDomainAutoConfiguration {

    @Autowired
    private Environment env;

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource domainDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    @PersistenceContext(unitName = "domain")
    public LocalContainerEntityManagerFactoryBean domainEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(domainDataSource());
        em.setPackagesToScan("com.myapp.model.domain","com.myapp.legacy");
        em.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        em.setPersistenceUnitName("domain");
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        final HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect",
                "org.hibernate.dialect.PostgreSQLDialect");
        em.setJpaPropertyMap(properties);

        return em;
    }


    @Bean
    public PlatformTransactionManager domainTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(domainEntityManager().getObject());
        return transactionManager;
    }

}
package com.myapp.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
import java.util.HashMap;

@Configuration
@PropertySource({"classpath:database.properties"})
@EnableJpaRepositories(
        basePackages = "com.myapp.persistence.lookup",
        entityManagerFactoryRef = "lookupEntityManager",
        transactionManagerRef = "lookupTransactionManager")
public class PersistenceLookupAutoConfiguration {

    @Autowired
    private Environment env;

    @Bean
    @ConfigurationProperties(prefix="spring.currency-datasource")
    public DataSource lookupDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @PersistenceContext(unitName = "lookup")
    public LocalContainerEntityManagerFactoryBean lookupEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(lookupDataSource());
        em.setPackagesToScan("com.myapp.model.lookup");
        em.setPersistenceUnitName("lookup");

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        final HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
        em.setJpaPropertyMap(properties);

        return em;
    }


    @Bean
    public PlatformTransactionManager lookupTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(lookupEntityManager().getObject());
        return transactionManager;
    }
}
...
.to("jpa:com.myapp.model.domain.Event?entityType=java.util.ArrayList&persistenceUnit=domain")

共有1个答案

丌官嘉勋
2023-03-14

使用persistenceUnit的entityManagerFactory选项实例

 类似资料:
  • 谢谢 ----更新----

  • 我需要创建一个Camel路由,它轮询一个数据库,转换检索到的数据,然后将新实体插入另一个数据库。我需要帮助配置。 为什么它要寻找persistence.xml文件而不是使用注释?我使用的是Spring Boot1.5.13,与Camel 2.21.1一起发布。

  • 有没有办法将quarkus security jpa与多个持久性单元一起使用?JpaIdentityProvider似乎直接注入了实体管理器工厂,这导致了“javax.persistence.EntityManagerFactory类型的不满意依赖”的异常。 可能有解决办法吗? 有什么建议吗? 谢谢文森特

  • 我有一个应用程序,它使用位于两个不同数据库中的一组JPA实体。我配置了多个持久性单元。 问题是我想使用模式生成自动生成模式,所有实体都是在两个数据库中创建的。 我在这两方面都有: 是的,我想使用元数据自动获取实体。我不想提供手动脚本,因为我需要使它与实体保持最新。 是否有方法标记由哪个PU生成的实体? 编辑:请注意,在@Table上添加“模式”属性并不能解决问题,因为每个PU将尝试在正确的模式中创

  • 我遇到了一个问题,在我的JPA表中没有任何内容被持久化。据我所知,我想我理解了的基本思想。我猜出现问题的原因是,我在一个可嵌入的对象中有一个。 一个简单的例子: 有什么线索表明可能出了什么问题吗? 为了简洁起见,我将尽量使附加信息尽可能简短。 创建计算原因 创建计算历史记录 调试信息在计算历史#创建 HibernateDAO仓库 Hibernate生成的SQL 看起来HiberNate甚至没有生成

  • 我正在使用Quartz与Spring集成来安排工作。为了保存quartz数据,我在spring配置中提供了一个数据源。 以上内容将把数据持久化到datasource中配置的一个模式中。我需要做的是将quartz数据存储到多个模式中。 我怎么做得到?