Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In
Continue with Google
Continue with Facebook
or use


Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here
Continue with Google
Continue with Facebook
or use


Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.


Have an account? Sign In Now

Sorry, you do not have a permission to ask a question, You must login to ask question.

Continue with Google
Continue with Facebook
or use


Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

Stack Ask

Stack Ask Logo Stack Ask Logo

Stack Ask Navigation

  • Home
  • About Us
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • About Us
  • Contact Us
Home/ Questions/Q 3555
Next
Answered
toilahtc
  • 1
toilahtcBeginner
Asked: December 10, 20212021-12-10T04:16:39+00:00 2021-12-10T04:16:39+00:00In: Spring

Làm sao để cấu hình tới 2 database trong 1 project spring boot?

  • 1

Làm sao để cấu hình tới 2 database trong 1 project spring boot?

Em gặp lỗi này: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available: expected single matching bean but found 2 khi sử dụng @Transactional. Em đã có đánh dấu @Transactional(transactionManager = "mmTransactionManager")

Anh em nào biết thì mong giúp đỡ em ạ, em cảm ơn. Do text quá dài nên em xin gửi cấu hình ở dưới comment.

datasourcespring
  • 6 6 Answers
  • 150 Views
  • 0 Followers
  • 0
Answer
Share
  • Facebook
  • Report

6 Answers

  • Voted
  • Oldest
  • Recent
  1. monkey Enlightened
    2021-12-10T06:59:17+00:00Added an answer on December 10, 2021 at 6:59 am
    This answer was edited.

    Spring JPA kết nối nhiều datasource sử dụng annotation nó sẽ kiểu thế này:

    @Data
    public class DataSourceProperties {
        private final String driverClassName;
        private final String jdbcUrl;
        private final String username;
        private final String password;
    }
    
    @ConfigurationProperties(prefix = "hibernate")
    public class HibernateProperties extends Properties {
        private static final long serialVersionUID = -817908147155147987L;
    }
    
    • 1
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
  2. Best Answer
    monkey Enlightened
    2021-12-10T06:59:34+00:00Added an answer on December 10, 2021 at 6:59 am
    This answer was edited.

    Khi sử dụng sẽ kiểu thế này:

    import javax.sql.DataSource;
    
    @Configuration
    @EnableConfigurationProperties(HibernateProperties.class)
    @ImportAutoConfiguration(RepositoryPropertiesConfig.class)
    public class EzyJpaConfig {
    
        @Autowired
        private ApplicationContext appContext;
    
        public static final String EXAMPLE1 = "example1";
        public static final String EXAMPLE2 = "example2";
    
        @Bean
        public EzyDataSourceFactory repositoryDataSourceFactory(RepositoryProperties properties) {
            return new EzyDataSourceFactory(
                properties.getDataSources(),
                appContext.getEnvironment(),
                "spring.datasource.hikari"
            );
        }
    
        @Bean
        public EzyJpaRepositoryFactory repositoryJpaRepositoryFactory(
            EzyJpaTransactionManagerFactory repositoryJpaTransactionManagerFactory
        ) {
            return new EzyJpaRepositoryFactory(repositoryJpaTransactionManagerFactory);
        }
    
        @Bean
        public EzyEntityManagerFactoryFactory repositoryEntityManagerFactoryFactory(
            EzyDataSourceFactory repositoryDataSourceFactory,
            HibernateProperties hibernateProperties
        ) {
            return new EzyEntityManagerFactoryFactory(
                repositoryDataSourceFactory,
                hibernateProperties,
                "com.example.ezy.web.entity"
            );
        }
    
        @Bean
        public EzyJpaTransactionManagerFactory repositoryJpaTransactionManagerFactory(
            EzyEntityManagerFactoryFactory repositoryEntityManagerFactoryFactory
        ) {
            return new EzyJpaTransactionManagerFactory(repositoryEntityManagerFactoryFactory);
        }
    
        // ==================== example1 ==========
        @Bean
        public DataSource example1DataSource(EzyDataSourceFactory repositoryDataSourceFactory) {
            return repositoryDataSourceFactory.createDataSource(EXAMPLE1);
        }
    
        @Bean
        public EntityManagerFactory example1EntityManagerFactory(
            DataSource example1DataSource,
            EzyEntityManagerFactoryFactory repositoryEntityManagerFactoryFactory
        ) {
            return repositoryEntityManagerFactoryFactory.createEntityManagerFactory(
                EXAMPLE1,
                example1DataSource
            );
        }
    
        @Bean
        public JpaTransactionManager example1TransactionManager(
            EntityManagerFactory example1EntityManagerFactory,
            EzyJpaTransactionManagerFactory repositoryEntityManagerFactoryFactory
        ) {
            return repositoryEntityManagerFactoryFactory.createJpaTransactionManager(
                EXAMPLE1,
                example1EntityManagerFactory
            );
        }
    
        // ==================== example2 ==========
        @Bean
        public DataSource example2DataSource(EzyDataSourceFactory repositoryDataSourceFactory) {
            return repositoryDataSourceFactory.createDataSource(EXAMPLE2);
        }
    
        @Bean
        public EntityManagerFactory example2EntityManagerFactory(
            DataSource example2DataSource,
            EzyEntityManagerFactoryFactory repositoryEntityManagerFactoryFactory
        ) {
            return repositoryEntityManagerFactoryFactory.createEntityManagerFactory(
                EXAMPLE2,
                example2DataSource
            );
        }
    
        @Bean
        public JpaTransactionManager example2TransactionManager(
            EntityManagerFactory example2EntityManagerFactory,
            EzyJpaTransactionManagerFactory repositoryEntityManagerFactoryFactory
        ) {
            return repositoryEntityManagerFactoryFactory.createJpaTransactionManager(
                EXAMPLE2,
                example2EntityManagerFactory
            );
        }
    
        // ================= config ===========
    
        @Getter
        @ConstructorBinding
        @AllArgsConstructor
        @ConfigurationProperties(prefix = "jpa")
        public static class RepositoryProperties {
            private final Map dataSources;
        }
    
        @Configuration
        @EnableConfigurationProperties(RepositoryProperties.class)
        @ConditionalOnMissingBean(RepositoryProperties.class)
        public static class RepositoryPropertiesConfig {
        }
    }
    
    • 1
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
  3. monkey Enlightened
    2021-12-10T07:13:22+00:00Added an answer on December 10, 2021 at 7:13 am
    import javax.sql.DataSource;
    
    public final class JpaConfigurations {
        private JpaConfigurations() {
        }
    
        public static  D createDataSource(
            DataSourceProperties properties,
            Class dataSourceClass
        ) {
            return DataSourceBuilder
                .create()
                .driverClassName(properties.getDriverClassName())
                .url(properties.getJdbcUrl())
                .username(properties.getUsername())
                .password(properties.getPassword())
                .type(dataSourceClass)
                .build();
        }
    
        public static EntityManagerFactory createEntityManagerFactory(
            DataSource dataSource,
            HibernateProperties hibernateProperties,
            String packageToScan
        ) {
            final LocalContainerEntityManagerFactoryBean factory =
                new LocalContainerEntityManagerFactoryBean();
            factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
            factory.setPackagesToScan(packageToScan);
            factory.setDataSource(dataSource);
            factory.setJpaProperties(hibernateProperties);
            factory.afterPropertiesSet();
            return factory.getObject();
        }
    
        public static JpaTransactionManager createJpaTransactionManager(
            EntityManagerFactory entityManagerFactory
        ) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    }
    
    import javax.sql.DataSource;
    
    @AllArgsConstructor
    public class EzyDataSourceFactory {
        private final Map dataSourcePropertiesByChainId;
        private final Environment environment;
        private final String hikariDataSourcePropertyPrefix;
    
        public DataSource createDataSource(String datasourceId) {
            final HikariDataSource dataSource = JpaConfigurations.createDataSource(
                dataSourcePropertiesByChainId.get(datasourceId),
                HikariDataSource.class
            );
            final Binder binder = Binder.get(environment);
            binder.bind(hikariDataSourcePropertyPrefix, Bindable.ofInstance(dataSource));
            return dataSource;
        }
    }
    
    import javax.sql.DataSource;
    
    @AllArgsConstructor
    public class EzyEntityManagerFactoryFactory {
    
        private final EzyDataSourceFactory exampleDataSourceFactory;
        private final HibernateProperties hibernateProperties;
        private final String packageToScan;
    
        public EntityManagerFactory createEntityManagerFactory(String datasourceId) {
            return createEntityManagerFactory(datasourceId, null);
        }
    
        public EntityManagerFactory createEntityManagerFactory(
            String datasourceId,
            DataSource dataSource
        ) {
            return JpaConfigurations.createEntityManagerFactory(
                dataSource != null ? dataSource : exampleDataSourceFactory.createDataSource(datasourceId),
                hibernateProperties,
                packageToScan
            );
        }
    }
    
    @AllArgsConstructor
    public class EzyJpaRepositoryFactory {
        private final EzyJpaTransactionManagerFactory ezyJpaTransactionManagerFactory;
    
        public <T, I, R extends JpaRepository> R createJpaRepository(
            String datasourceId,
            Class jpaRepositoryClass,
            JpaTransactionManager jpaTransactionManager
        ) {
            final JpaTransactionManager actualJpaTransactionManager =
                jpaTransactionManager == null
                ? jpaTransactionManager
                : ezyJpaTransactionManagerFactory.createJpaTransactionManager(datasourceId);
            final EntityManagerFactory entityManagerFactory =
                actualJpaTransactionManager.getEntityManagerFactory();
            assert entityManagerFactory != null;
            final EntityManager entityManager =
                SharedEntityManagerCreator.createSharedEntityManager(entityManagerFactory);
            final JpaRepositoryFactory jpaRepositoryFactory = new JpaRepositoryFactory(entityManager);
            final TransactionInterceptor transactionInterceptor = new TransactionInterceptor(
                (TransactionManager) actualJpaTransactionManager,
                new AnnotationTransactionAttributeSource()
            );
            jpaRepositoryFactory.addRepositoryProxyPostProcessor((factory, repositoryInformation) ->
                factory.addAdvice(transactionInterceptor)
            );
            return jpaRepositoryFactory.getRepository(jpaRepositoryClass);
        }
    
        public <T, I, R extends JpaRepository> R createJpaRepositoryWithAspects(
            String datasourceId,
            Class jpaRepositoryClass,
            JpaTransactionManager jpaTransactionManager,
            Object... aspects
        ) {
            final R nakedJpaRepository = createJpaRepository(datasourceId, jpaRepositoryClass, jpaTransactionManager);
            final AspectJProxyFactory proxyFactory = new AspectJProxyFactory(nakedJpaRepository);
            for (Object aspect : aspects) {
                proxyFactory.addAspect(aspect);
            }
            return proxyFactory.getProxy();
        }
    }
    
    @AllArgsConstructor
    public class EzyJpaTransactionManagerFactory {
        private final EzyEntityManagerFactoryFactory ezyEntryManagerFactoryFactory;
    
        public JpaTransactionManager createJpaTransactionManager(String datasourceId) {
            return createJpaTransactionManager(datasourceId, null);
        }
    
        public JpaTransactionManager createJpaTransactionManager(
            String datasourceId,
            EntityManagerFactory entityManagerFactory
        ) {
            return JpaConfigurations.createJpaTransactionManager(
                entityManagerFactory != null
                    ? entityManagerFactory
                    : ezyEntryManagerFactoryFactory.createEntityManagerFactory(datasourceId)
            );
        }
    }
    
    • 1
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
  4. toilahtc Beginner
    2021-12-10T04:17:30+00:00Added an answer on December 10, 2021 at 4:17 am
    This answer was edited.

    Em cấu hình trong spring.xml như sau:

    <!– JPA –>
    
    <jpa:repositories base-package="pakageOfDAO1"
            entity-manager-factory-ref="mmEntityManager"
            transaction-manager-ref="mmTransactionManager">
    
    </jpa:repositories>
    <jpa:repositories base-package="pakageOFDAO"
            entity-manager-factory-ref="mmEtcEntityManager"
            transaction-manager-ref="mmEtcTransactionManager"
    >
    
    </jpa:repositories>
    
    <!– Datasource ETC. –>
    <bean id="secondDatasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${spring.secondDatasource.driverClassName}"/>
        <property name="url" value="${spring.secondDatasource.url}"/>
        <property name="username" value="${spring.secondDatasource.username}"/>
        <property name="password" value="${spring.secondDatasource.password}"/>
    </bean>
    
    <!– Datasource, that is currently hsqldb (in-memory database). –>
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${spring.datasource.driver-class-name}"/>
        <property name="url" value="${spring.datasource.url}"/>
            <property name="username" value="${spring.datasource.username}"/>
        <property name="password" value="${spring.datasource.password}"/>
    </bean>
    
    <bean id="hibernateJpaVendorAdapter"
          class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    <!– EntityEtcManagerFactory –>zxczx
    <bean id="mmEtcEntityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:packagesToScan="pakage3"
          p:dataSource-ref="secondDatasource"
          p:persistenceUnitName="name2"
    
    >
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MariaDBDialect</prop>
                <prop key="hibernate.show-sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">10</prop>
            </props>
        </property>
    </bean>
    
    <!–     Transactions –>
    <bean id="mmEtcTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="mmEtcEntityManager"/>
    </bean>
    
    <!– EntityManagerFactory –>
    <bean id="mmEntityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:packagesToScan="pakage1, pakage2"
          p:dataSource-ref="datasource"
          p:persistenceUnitName="name2"
    
    >
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show-sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">10</prop>
            </props>
        </property>
    </bean>
    
    <!– Transactions –>
    <bean id="mmTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="mmEntityManager"/>
    </bean>
    
    • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
  5. monkey Enlightened
    2021-12-10T06:52:42+00:00Added an answer on December 10, 2021 at 6:52 am

    Em có thể paste cả exception lên đây không? (sử dụng thẻ pre nhé). Còn nhìn vào câu hỏi của em thì anh thấy lỗi này xảy ra khi trong code của em khai báo 2 đối tượng có cùng tên `mmTransactionManager`, em thử tìm kiếm xem có không và đặt 2 tên khác nhau nhé.

    • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report
  6. Minh Duc Cao Beginner
    2021-12-10T10:26:46+00:00Added an answer on December 10, 2021 at 10:26 am

    Lỗi này là do khai báo 2 bean có cùng một tên đó, kiểm tra lại file xml khai báo. Nếu sử dụng spring boot thì bạn tìm hiểu thêm anotation @Qualifier

    • 0
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

You must login to add an answer.

Continue with Google
Continue with Facebook
or use


Forgot Password?

Need An Account, Sign Up Here

Sidebar

Ask A Question

Stats

  • Questions 553
  • Answers 1k
  • Best Answers 62
  • Users 290
  • Popular
  • Answers
  • monkey

    [Deep Learning] Làm thế nào để xác định được cái ...

    • 16 Answers
  • Tú Trần Anh

    [Ezyfox Server] Unity game client không gửi được command khi ...

    • 12 Answers
  • monkey

    [Go] khi nào go func được gọi?

    • 10 Answers
  • Hoàng Kiếm
    Hoàng Kiếm added an answer Huy ơi bạn đã thử login bằng command, mysql -u… May 21, 2022 at 5:42 am
  • tvd12
    tvd12 added an answer public class EzyEventLoopGroup { private final EzyRoundRobin eventLoops; private final… May 19, 2022 at 2:20 pm
  • monkey
    monkey added an answer Như vậy có nghĩa là chưa cài thành công em… May 19, 2022 at 9:17 am

Related Questions

  • monkey

    Hướng dấn sử dụng Spring Boot Test controller

    • 0 Answers
  • ptitdev

    Nhiều instance service websocket ?

    • 2 Answers
  • Hihi

    Expose API trả về kiểu Video (giống như Tiktok,..)

    • 7 Answers

Top Members

tvd12

tvd12

  • 63 Questions
  • 1k Points
Enlightened
monkey

monkey

  • 88 Questions
  • 580 Points
Enlightened
Nguyễn Thái Sơn

Nguyễn Thái Sơn

  • 140 Questions
  • 220 Points
Professional

Trending Tags

.net core abstract class analytics android ansible anti-flooding apache poi api async asyncawait atomicboolean backend backend nestjs bash script batch bean big project binding bitcoin blockchain blog british buffered build bundle c# cache caching callback career career path cast centos chat cloud cloud reliability commit company content-disposition contract cors cosmos css database datasource datastructure decentralized exchange deep learning design-pattern devops dex distraction programing docker download draw.io du học eclip editor employee english erc20 erc721 eth ethereum ethereum login extensions exyfox ezyfox ezyfox-boot ezyfox-server ezyfoxserver ezyhttp facebook fe flutter freetank french front-end frontend fullstack fulltextsearch future game game-box game-room game-server get git go golang google grapql grpc guide hazelcast hibernate hibernateconfig html http https indexing intellij interface interview io ipfs isolate issue it java javacore java core javascript java spring javaw java web job jpa js json jsp & servlet jvm jwt kafka keep promise kerberos keycloak kotlin language languague library load-balancing log log4j log4j-core login machine learning macos math maven merge messaging metamask microservice model msgpack multiple tenant multithread multithreading mysql n naming naming convention netcore netty nft nft game nio nodejs non-blocking io opensource optimize orm pagination pancakeswap panic pgpool phỏng vấn pointer postgresql pre programming promise push message android python python unicode question queue rabbitmq reactive reactjs reactjs download recyclerview redis request resource rest roadmap ropssten ropsten rust rxjava schedule search security server shift jis singleton sjis slack smart contract socket soft delete sosanh spring spring-boot-test spring-jpa spring aop springboot spring boot spring data jpa spring redis springsecurity spring security sql sql server sse stackask storage stream structure trong spring boot system environment variables thread threadjava thymeleaf totp tracking location unit test unity upload file vector view volatile vue vue cli web3 web3 client webpack websocket windows 11 winforms work zookeeper

Footer

Stack Ask

Stack Ask is where Developers Ask & Answers. It will help you resolve any questions and connect you with other people.

About Us

  • Meet The Team
  • About Us
  • Contact Us

Legal Stuff

  • Terms of Service
  • Privacy Policy
  • Cookie Policy

Help

  • Knowledge Base
  • Support

Follow

© 2021 Stack Ask. All Rights Reserved
Powered by youngmonkeys.org