【问题标题】:Multiple Database connection JPA多数据库连接 JPA
【发布时间】:2020-09-21 17:24:08
【问题描述】:

我正在尝试使用 Spring Boot JPA 连接两个数据库

Application.properties:

应用程序配置。

server.port=8102

# Hibernate configuration.
spring.jpa.show-sql = true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
#spring.jpa.hibernate.ddl-auto = create-drop
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.SQLServer2012Dialect
app.datasource.cardHolder.url=jdbc:sqlserver://server:22;databaseName=DB1
app.datasource.cardHolder.username=name
app.datasource.cardHolder.password=psw
app.datasource.cardHolder.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

server.path=F:\\

app.datasource.card.url=jdbc:sqlserver://server:22;databaseName=DB2
app.datasource.card.username=uname
app.datasource.card.password=psw
app.datasource.card.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver

spring.jpa.open-in-view=false

# Logging configuration.
logging.level.com.springboot.storedprocedure=DEBUG
logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %msg%n

com.app.configuration

卡配置:

@Configuration
@EnableJpaRepositories(basePackages = "com.app.repository",
        entityManagerFactoryRef = "cardEntityManagerFactory",
        transactionManagerRef= "cardTransactionManager")
public class CardDataSourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.card")
    public DataSourceProperties cardDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean
    @ConfigurationProperties("app.datasource.card.configuration")
    public DataSource cardDataSource() {
        return cardDataSourceProperties().initializeDataSourceBuilder()
                .type(BasicDataSource.class).build();
    }

//    @PersistenceContext(unitName = "first")
    @Primary
    @Bean(name = "cardEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean cardEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(cardDataSource())
                .packages(Card.class)
                .build();
    }

    @Primary
    @Bean
    public PlatformTransactionManager cardTransactionManager(
            final @Qualifier("cardEntityManagerFactory") LocalContainerEntityManagerFactoryBean cardEntityManagerFactory) {
        return new JpaTransactionManager(cardEntityManagerFactory.getObject());
    }

}

持卡人:

@Configuration
@EnableJpaRepositories(basePackages = "com.app.repository2",
        entityManagerFactoryRef = "cardHolderEntityManagerFactory",
        transactionManagerRef= "cardHolderTransactionManager")
public class CardHolderDataSourceConfiguration {

    @Bean
    @ConfigurationProperties("app.datasource.cardholder")
    public DataSourceProperties cardHolderDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("app.datasource.cardholder.configuration")
    public DataSource cardholderDataSource() {
        return cardHolderDataSourceProperties().initializeDataSourceBuilder()
                .type(BasicDataSource.class).build();
    }
    
//    @PersistenceContext(unitName = "second")
    @Bean(name = "cardHolderEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean cardHolderEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(cardholderDataSource())
                .packages(CardHolder.class)
                .build();
    }

    @Bean
    public PlatformTransactionManager cardHolderTransactionManager(
            final @Qualifier("cardHolderEntityManagerFactory") LocalContainerEntityManagerFactoryBean cardHolderEntityManagerFactory) {
        return new JpaTransactionManager(cardHolderEntityManagerFactory.getObject());
    }
}

CardConfi 已正确设置 JPARepository 并返回基于 DB2 的数据,但我在 CardHolderRepository 中添加 EntityManger 的方式相同,如下所示,

@Entity
@NamedStoredProcedureQueries(value= {
        @NamedStoredProcedureQuery(name= "callSP", procedureName= "cardmsSP", parameters= {
                @StoredProcedureParameter(mode= ParameterMode.IN, name= "Name", type= String.class)
        })
})

public class CardHolder implements Serializable {

 //getter setter
}

com.app.repository2

@Repository
public class CardHolderDao {
    
    @Autowired
    SPRepository spRep;
    @PersistenceContext
    private EntityManager em;

@SuppressWarnings("unchecked")
    public List<CardHolder> gecardtHolderList (String input) {
     
     return em.createNamedStoredProcedureQuery("cardmsSP").setParameter("Name", input).getResultList();
}

}

com.app.repository2

public interface SPRepository extends JpaRepository<CardHolder, Long>, JpaSpecificationExecutor<CardHolder>{

    
}

问题是EntityManager em 总是指向DB2 而不是DB1。我在哪里做错了?

【问题讨论】:

    标签: java spring-boot hibernate spring-data-jpa


    【解决方案1】:

    你应该设置EntityManagerFactoryBuilder#persistenceUnit

    @Bean(name = "cardHolderEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean cardHolderEntityManagerFactory(
        EntityManagerFactoryBuilder builder) {
        return builder
               .dataSource(cardholderDataSource())
               .packages(CardHolder.class)
               .persistenceUnit("cardHolderEntityManager") // !!!
               .build();
    }
    

    然后

    @PersistenceContext(unitName = "cardHolderEntityManager")
    EntityManager em;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2011-08-16
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多