Spring boot jpa只能从多个数据源访问主数据源
试图在spring boot内使用以下2个数据源: 数据库配置: //没有小学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
@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();
}
}