Java 多数据库连接JPA

Java 多数据库连接JPA,java,spring-boot,hibernate,spring-data-jpa,Java,Spring Boot,Hibernate,Spring Data Jpa,我正在尝试使用SpringBootJPA连接两个数据库 Application.properties: 应用程序配置。 com.app.configuration CardConfig: @Configuration @EnableJpaRepositories(basePackages = "com.app.repository", entityManagerFactoryRef = "cardEntityManagerFactory",

我正在尝试使用SpringBootJPA连接两个数据库

Application.properties:

应用程序配置。 com.app.configuration

CardConfig:

@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的数据,但与我在CardConfi存储库中添加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();
}

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

    
}
@存储库
公共类持卡人{
@自动连线
预测性spRep;
@持久上下文
私人实体管理者;
@抑制警告(“未选中”)
公共列表gecardtHolderList(字符串输入){
返回em.createNamedStoredProcedureQuery(“cardmsSP”).setParameter(“Name”,input).getResultList();
}
}
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();
}

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

    
}
公共接口存储扩展了JPA存储,JPA指定执行器{
}

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

您应该设置
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;