Spring Boot入門見本-151-JPA-multi-source統合Jpa多データソースMulti Source


Spring Boot入門見本-151-JPA-multi-source統合Jpa多データソースMulti Source
システムが複数に分割されると、ユーザテーブルと注文書テーブルが別のデータベースにあるようになります.本デモでは、Jpa多データソースMulti Sourceをjpa hibernateを使ってどのように統合するかを実証しています.
前言
本Spring Boot入門見本準備作業参考:
  • Spring Boot入門例-001-JavaとMavenの設置配置
  • Spring Boot入門例-003-indeaインストール構成とプラグイン
  • Spring Boot入門例-005-どうやって
  • を実行しますか?
    pox.xml
    必要な依存性は以下の通りです.具体的にはこの項目のpox.xmlを参照してください.
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                org.springframework.boot
                spring-boot-starter-data-jpa
            
            
                mysql
                mysql-connector-java
            
            
                org.projectlombok
                lombok
                true
            
    
    設定ファイル
    データテーブル構造はルートディレクトリ下のdb.sqlを参照してください.
    USE springbootdemo;
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (
      `id` varchar(255) NOT NULL,
      `name` varchar(255) NOT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    USE springbootdemo1;
    DROP TABLE IF EXISTS `tbl_order`;
    CREATE TABLE `tbl_order` (
      `id` varchar(255) NOT NULL,
      `student_id` varchar(255) NOT NULL,
      `sn` varchar(255) NOT NULL,
      `amount` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    resoures/appration.ymlの設定内容
    spring:
      datasource:
        user:
          driverClassName: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/springbootdemo?useUnicode=true&characterEncoding=utf-8&useSSL=false&useAffectedRows=true
          username: root
          password: root
        order:
          driverClassName: com.mysql.jdbc.Driver
          url: jdbc:mysql://localhost:3306/springbootdemo1?useUnicode=true&characterEncoding=utf-8&useSSL=false&useAffectedRows=true
          username: root
          password: root
    
      jpa:
        show-sql: true
        generate-ddl: true
        hibernate:
          ddl-auto: update
        properties:
          hibernate:
            dialect: org.hibernate.dialect.MySQL55Dialect
    
    コード解析
    このプロジェクトには多くのカタログがあります.それぞれ次のように説明します.
  • controllerディレクトリは、コントローラファイル
  • である.
  • entityディレクトリは、テーブル内のフィールド
  • に対応しています.
  • daoディレクトリデータアクセスオブジェクト
  • サービスインターフェースディレクトリ
  • service/implはサービスインターフェースの具体的な実現ディレクトリ
  • である.
  • utilはツールカタログです.分布式id雪花アルゴリズム
  • を加入します.
    以上の説明はSpring Boot入門の例-040-JPAを参考にして自動的にデータベース中のデータを読み取ります.
    DataSourceConfig.javaプロファイル解析
    @Configuration
    public class DataSourceConfig {
    
        /**
         * user 
         * @author Funsonli
         * @date 2019/11/25
         */
        @Primary
        @Bean(name = "userDataSourceProperties")
        @Qualifier("userDataSourceProperties")
        @ConfigurationProperties(prefix = "spring.datasource.user")
        public DataSourceProperties userDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        @Primary
        @Bean(name = "userDataSource")
        @Qualifier("userDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.user")
        public DataSource userDataSource(@Qualifier("userDataSourceProperties") DataSourceProperties dataSourceProperties) {
            return dataSourceProperties.initializeDataSourceBuilder().build();
        }
    
        /**
         * order 
         * @author Funsonli
         * @date 2019/11/25
         */
        @Bean(name = "orderDataSourceProperties")
        @Qualifier("orderDataSourceProperties")
        @ConfigurationProperties(prefix = "spring.datasource.order")
        public DataSourceProperties orderDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        @Bean(name = "orderDataSource")
        @Qualifier("orderDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.order")
        public DataSource orderDataSource(@Qualifier("orderDataSourceProperties") DataSourceProperties dataSourceProperties) {
            return dataSourceProperties.initializeDataSourceBuilder().build();
        }
    
    }
    
    UserConfigユーザーテーブルがあるデータソースの配置
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
            entityManagerFactoryRef = "userEntityManagerFactory",
            transactionManagerRef = "userTransactionManager",
            basePackages = {"com.funsonli.springbootdemo151jpamultisource.dao.user"})
    
    public class UserConfig {
        @Autowired
        private HibernateProperties hibernateProperties;
        @Resource
        @Qualifier("userDataSource")
        private DataSource userDataSource;
    
        @Primary
        @Bean(name = "userEntityManager")
        public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
            return userEntityManagerFactory(builder).getObject().createEntityManager();
        }
    
        @Resource
        private JpaProperties jpaProperties;
    
        /**
         *          
         */
        @Primary
        @Bean(name = "userEntityManagerFactory")
        public LocalContainerEntityManagerFactoryBean userEntityManagerFactory(EntityManagerFactoryBuilder builder) {
    
            Map properties = hibernateProperties.determineHibernateProperties(
                    jpaProperties.getProperties(), new HibernateSettings());
            return builder
                    .dataSource(userDataSource)
                    .packages("com.funsonli.springbootdemo151jpamultisource.entity.user")
                    .persistenceUnit("userPersistenceUnit")
                    .properties(properties)
                    .build();
        }
    
        @Primary
        @Bean(name = "userTransactionManager")
        public PlatformTransactionManager userTransactionManager(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(userEntityManagerFactory(builder).getObject());
        }
    }
    
    Order Config注文書があるデータソースの配置
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
            entityManagerFactoryRef = "orderEntityManagerFactory",
            transactionManagerRef = "orderTransactionManager",
            basePackages = {"com.funsonli.springbootdemo151jpamultisource.dao.order"})
    public class OrderConfig {
    
        @Autowired
        @Qualifier("orderDataSource")
        private DataSource orderDataSource;
    
        @Autowired
        private HibernateProperties hibernateProperties;
    
        @Bean(name = "orderEntityManager")
        public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
            return orderEntityManagerFactory(builder).getObject().createEntityManager();
        }
    
        @Resource
        private JpaProperties jpaProperties;
    
        @Bean(name = "orderEntityManagerFactory")
        public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(EntityManagerFactoryBuilder builder) {
    
            Map properties = hibernateProperties.determineHibernateProperties(
                    jpaProperties.getProperties(), new HibernateSettings());
            return builder
                    .dataSource(orderDataSource)
                    .packages("com.funsonli.springbootdemo151jpamultisource.entity.order")
                    .persistenceUnit("orderPersistenceUnit")
                    .properties(properties)
                    .build();
        }
    
        @Bean(name = "orderTransactionManager")
        PlatformTransactionManager orderTransactionManager(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(orderEntityManagerFactory(builder).getObject());
        }
    
    }
    
    
    StudentController.javaコントローラは、service操作データベースを呼び出します.
    @Slf4j
    @RestController
    @RequestMapping("/student")
    public class StudentController {
    
        @Autowired
        StudentService studentService;
    
        @Autowired
        OrderService orderService;
    
        @GetMapping({"", "/", "index"})
        public String index() {
            return studentService.index().toString() + " | " + orderService.index().toString();
        }
    
        @GetMapping("/add/{name}/{age}")
        public String add(HttpServletRequest request, @PathVariable String name, @PathVariable Integer age) {
            Student model = new Student();
            model.setName(name);
            model.setAge(age);
    
            model = studentService.save(model);
            return model.toString();
        }
    
        @GetMapping("/order/{studentId}/{amount}")
        public String order(HttpServletRequest request, @PathVariable String studentId, @PathVariable Integer amount) {
            Order model = new Order();
            model.setStudentId(studentId);
            model.setSn(UUID.randomUUID().toString().replace("-", ""));
            model.setAmount(amount);
    
            model = orderService.save(model);
            return model.toString();
        }
    }
    
    
    実行
    クリックして実行
             
          http://localhost:8080/student/add/funson/30
          http://localhost:8080/student/add/zhonghua/28
    
             
          http://localhost:8080/student/order/sssss/30
          http://localhost:8080/student/order/ddddd/28
    
          http://localhost:8080/student/
    [Student(id=381159203135426560, name=funson, age=30), Student(id=381159203135926560, name=zhonghua, age=28)), Order(id=396289506464108544, studentId=aa, sn=9f53a28efe50461e97700c0f13af414f, amount=123)]
    
                      
    
    参照
  • Spring Boot入門サンプルソースコードアドレスhttps://github.com/funsonli/spring-boot-demo
  • Bootanソースコードアドレスhttps://github.com/funsonli/bootan
  • 付属する
    本Spring Boot入門の見本とサンプルコードが好きなら、素敵なスターを注文してください.