Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot jpa只能从多个数据源访问主数据源_Jpa_Datasource_Spring Boot - Fatal编程技术网

Spring boot jpa只能从多个数据源访问主数据源

Spring boot jpa只能从多个数据源访问主数据源,jpa,datasource,spring-boot,Jpa,Datasource,Spring Boot,试图在spring boot内使用以下2个数据源: 数据库配置: //没有小学 @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "rwEntityManagerFactory", transactionManagerRef = "rwTransactionManager", basePackages = {"com.cvs.dvp.r

试图在spring boot内使用以下2个数据源:

数据库配置:

//没有小学

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "rwEntityManagerFactory",
    transactionManagerRef = "rwTransactionManager",
    basePackages = {"com.cvs.dvp.repository.rw"})
@PropertySource("classpath:application.properties")

public class RwDbConfiguration {
@Bean(name="rwDataSource")
//@Primary
@ConfigurationProperties(prefix="datasource.rw")
public DataSource rwDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean(name="rwEntityManagerFactory")
@Qualifier("rwEntityManagerFactory")
public EntityManagerFactory rwEntityManagerFactory() {
    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
    jpaVendorAdapter.setShowSql(true);
    jpaVendorAdapter.setGenerateDdl(false);
    jpaVendorAdapter.setDatabase(Database.ORACLE);
    LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
    lef.setDataSource(rwDataSource());
    lef.setJpaVendorAdapter(jpaVendorAdapter);
    lef.setPackagesToScan("com.cvs.dvp.domain.rw");
    lef.setPersistenceUnitName("rw");
    lef.afterPropertiesSet();
    return lef.getObject();
}

@Bean(name="rwTransactionManager")
@Qualifier("rwTransactionManager")
  public JpaTransactionManager transactionManager(@Qualifier("rwEntityManagerFactory")EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
}
及//primary

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "dsEntityManagerFactory",
    transactionManagerRef = "dsTransactionManager",
    basePackages = {"com.cvs.dvp.repository.dsd"}) 
@PropertySource("classpath:application.properties")
public class DsdDbConfiguration {

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

@Bean(name="dsEntityManagerFactory")
@Qualifier("dsEntityManagerFactory")
public EntityManagerFactory dsEntityManagerFactory( ) {
    HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
    jpaVendorAdapter.setShowSql(true);
    jpaVendorAdapter.setGenerateDdl(true);
    jpaVendorAdapter.setDatabase(Database.ORACLE);

    LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
    lef.setDataSource(dsDataSource());
    lef.setJpaVendorAdapter(jpaVendorAdapter);
    lef.setPackagesToScan("com.cvs.dvp.domain.dsd");
    lef.setPersistenceUnitName("dsd");
    lef.afterPropertiesSet();
    return lef.getObject();
}


@Bean(name="dsTransactionManager")
@Qualifier("dsTransactionManager")
@Primary
public JpaTransactionManager transactionManager(@Qualifier("dsEntityManagerFactory")EntityManagerFactory emf){
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}
}
这些服务包括:

@Service
public class ReceiptServiceImpl implements ReceiptService {

private static final Logger LOGGER = LoggerFactory.getLogger(ReceiptServiceImpl.class);
private final ReceiptRepository repository;

@Autowired
@PersistenceContext(unitName = "rw")
@Qualifier("rwTransactionManager")
private  JpaTransactionManager jpaTransactionManager;

@Inject
public ReceiptServiceImpl(final ReceiptRepository repository) {
    this.repository = repository;
}

@Override
@Transactional("rwTransactionManager")
public Receipt save(@NotNull @Valid final Receipt receipt) {
     EntityManagerFactory emf = jpaTransactionManager.getEntityManagerFactory();
     EntityManager entityManager = emf.createEntityManager();
    LOGGER.debug("Creating {}", receipt.getId());


    Receipt existing = repository.findOne(receipt.getStoreNumber());
    if (existing != null) {
        throw new UserAlreadyExistsException(
                String.format("There already exists a receipt with id=%s", receipt.getId()));
    }
    return repository.save(existing);
}

@Override
@Transactional("rwTransactionManager")
public List<Receipt> getList() {
    LOGGER.debug("Retrieving the list of all users");
    return repository.findAll();
}
@Override
@Transactional("rwTransactionManager")
public Receipt getOne(String storeNumber) {
    return repository.findOne(storeNumber);
}
}
@服务
公共类ReceiptServiceImpl实现ReceiptService{
私有静态最终记录器Logger=LoggerFactory.getLogger(ReceiptServiceImpl.class);
私有最终接收存储库;
@自动连线
@PersistenceContext(unitName=“rw”)
@限定符(“rwTransactionManager”)
私人JpaTransactionManager JpaTransactionManager;
@注入
公共ReceiptServiceImpl(最终ReceiptRepository存储库){
this.repository=存储库;
}
@凌驾
@事务性(“rwTransactionManager”)
公共收据保存(@NotNull@有效的最终收据){
EntityManagerFactory emf=jpaTransactionManager.getEntityManagerFactory();
EntityManager EntityManager=emf.createEntityManager();
debug(“创建{}”,receive.getId());
现有收据=repository.findOne(Receipt.getStoreNumber());
if(现有!=null){
抛出新的UserAlreadyExistsException(
format(“已经存在id=%s的收据”,receipt.getId());
}
返回存储库。保存(现有);
}
@凌驾
@事务性(“rwTransactionManager”)
公共列表getList(){
debug(“检索所有用户的列表”);
返回repository.findAll();
}
@凌驾
@事务性(“rwTransactionManager”)
公共收据getOne(字符串storeNumber){
返回repository.findOne(storeNumber);
}
}

@服务
@验证
公共类StatusServiceImpl实现StatusService{
私有静态最终记录器记录器=LoggerFactory.getLogger(StatusServiceImpl.class);
私有最终状态存储库;
@自动连线
@限定词(“dsTransactionManager”)
私人JpaTransactionManager JpaTransactionManager;
@注入
public StatusServiceImpl(最终状态存储库){
this.repository=存储库;
}
@凌驾
@交易的
公共状态保存(@NotNull@Valid final Status){
EntityManagerFactory emf=jpaTransactionManager.getEntityManagerFactory();
EntityManager EntityManager=emf.createEntityManager();
debug(“创建{}”,状态);
Status existing=repository.findOne(Status.getStatusCd());
if(现有!=null){
抛出新的UserAlreadyExistsException(
format(“已经存在id=%s的用户”,status.getStatusCd());
}
返回存储库。保存(状态);
}
@凌驾
@交易的
公共列表getList(){
debug(“检索所有用户的列表”);
返回repository.findAll();
}
}
问题:bean连接正常,但只能访问主数据源,另一个数据源出现“表或视图不存在”错误,但如果将其配置为主数据源,则一切正常,并且之前的主数据源将不可访问

试图将它们中的任何一个都不作为post主,但无法通过spring引导编译器

SpringCLI版本为1.2.1


感谢您的帮助。

您的代码有缺陷,真的有缺陷。。。你究竟为什么要从
JpaTransactionManager
获取
EntityManagerFactory
。请删除该代码,因为它不是必需的,而且非常难看。在打开
EntityManager
而不关闭时,它还会(在某些时候)引入问题,这将导致池不足。在服务的
@Transactional
注释中,指定要使用的事务管理器。没有spring引导编译器,它可能只会在应用程序启动时失败。配置非常简单。您可以查看此链接注意:避免使用@PropertySource,因为当spring启动时,它会读取application.properties。
@Service
@Validated
public class StatusServiceImpl implements StatusService {
private static final Logger LOGGER = LoggerFactory.getLogger(StatusServiceImpl.class);
private final StatusRepository repository;

@Autowired
@Qualifier("dsTransactionManager")
private  JpaTransactionManager jpaTransactionManager;

@Inject
public StatusServiceImpl(final StatusRepository repository) {
    this.repository = repository;
}

@Override
@Transactional
public Status save(@NotNull @Valid final Status status) {
     EntityManagerFactory emf = jpaTransactionManager.getEntityManagerFactory();
     EntityManager entityManager = emf.createEntityManager();
            LOGGER.debug("Creating {}", status);

    Status existing = repository.findOne(status.getStatusCd());
    if (existing != null) {
        throw new UserAlreadyExistsException(
                String.format("There already exists a user with id=%s", status.getStatusCd()));
    }
    return repository.save(status);
}

@Override
@Transactional
public List<Status> getList() {
    LOGGER.debug("Retrieving the list of all users");
    return repository.findAll();
}

}