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
  • 173 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 823
  • Answers 1k
  • Best Answers 80
  • Users 334
  • Popular
  • Answers
  • monkey

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

    • 16 Answers
  • Thành Vương

    Bug sai đường dẫn khi config ckeditor lên live

    • 14 Answers
  • Tú Trần Anh

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

    • 12 Answers
  • tvd12
    tvd12 added an answer Anh thấy chỉ cần lúc tạo bảng em cứ khai… January 20, 2023 at 4:28 pm
  • monkey
    monkey added an answer 1. Anh chưa hiểu là cơ sở dữ liệu của… January 16, 2023 at 9:55 am
  • monkey
    monkey added an answer Em có thể tham khảo 2 lớp này: https://github.com/youngmonkeys/ezymq/tree/master/ezymq-kafka/src/main/java/com/tvd12/ezymq/kafka/serialization. Ở… January 16, 2023 at 6:34 am

Related Questions

  • Cường Nguyễn Hữu

    Xóa kiểm tra ràng buộc primary key-foreign key khi sử ...

    • 1 Answer
  • Vo Thanh Vuong

    IOC và Dependency Injection

    • 1 Answer
  • Vo Thanh Vuong

    Không lấy được data khi dùng RestTemplate

    • 3 Answers

Top Members

tvd12

tvd12

  • 76 Questions
  • 1k Points
Enlightened
monkey

monkey

  • 122 Questions
  • 1k Points
Enlightened
Nguyễn Thái Sơn

Nguyễn Thái Sơn

  • 205 Questions
  • 307 Points
Enlightened

Trending Tags

#formatdate .net .net core .net oop abstract class access app access token ai analytics android ansible anti-flooding apache poi api app architecture artificial intelligence assembly async asyncawait atomicboolean authentication backend backend nestjs background bash script batch bean big project binding bitcoin blockchain blog boot-nodes branch british btree bucket4j buffered build bundle c# c# .net cache caching callback career career path cast centos chat cloud cloud reliability commit communication company computer science concurrent config-css connection pool content-disposition contract convert date to number cookie cors cosmos cosmos-sdk crawl data cron css database database migration datasource datastructure deadlock decentralized exchange deep learning deploy contract design-pattern design patterns devops dex di distraction programing dns docker download draw.io du học duration dữ liệu lớn eclip editor elasticsearch email employee english erc20 erc721 estimation eth ethereum ethereum login excel exception exception handle exception handler executor export compliance extensions exyfox ezyfox ezyfox-boot ezyfox-server ezyfoxserver ezyhttp ezymq-kafka ezyredis facebook fe filter floating point flutter format json freetank french front-end frontend fullstack fulltextsearch future gallery game game-box game-room game-server gateway get get file zip git glide go golang google gorilla graduation thesis graphql grapql grpc guide h2 database handy terminal hazelcast hibernate hibernateconfig html http https hyperloglog image index indexing integration-test intellij interface interview io ioc ipfs isolate issue it java java core javacore javascript java spring javaw java web jenkins jetbrains job join jotform jpa js json json file jsonproperty json to object jsp jsp & servlet junit-test jvm jwt kafka keep promise kerberos keycloak kotlin language languague library list load-balancing load balancer lock log log4j log4j-core login lưu trữ machine learning macos mail mail template main maria db math maven merge message queue messaging metamask microservice microservices migration mobile model mongo monitoring mq msgpack multi-threading multiple tenant multithread multithreading mysql n naming naming convention nan netcore netty networking nft nft game nginx nio node.js nodejs non-blocking io null oop opensource optimize orm otp message paginaiton pagination pancakeswap panic partition pdf pgpool phỏng vấn plugin pointer postgresql pre private_key procedure profile programming project management promise properties push-noti push message android push notification python python unicode qrcode question queue rabbitmq reactive reactjs reactjs download readmoretextview recyclerview redis refactor refresh token regex replica repository request resilence4j resource rest resttemplate roadmap ropssten ropsten round robin rust rxjava s3 schedule scheduled scheduled spring boot search security send email send mail server servlet session shift jis singleton sjis slack smart contract soap socket socket server soft delete solution sosanh spring spring-boot-test spring-jpa spring aop spring boot springboot spring data jpa spring redis spring security springsecurity springwebflux mysql spring websocket spring websocket cors sql sql server sse ssl email stackask storage stream stream api stress test structure trong spring boot study synchronize synchronized system environment variables test thread threadjava threadpool thread pool thymeleaf tomcat totp tracking location transaction transfer transfer git udp uniswap unit test unity upload upload file utf-8 file validate validate date vector view volatile vue vue cli watermark web web3 web3 client webassembly webflux webpack websocket windows 11 winforms work zip file 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

Follow

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