当前位置:   article > 正文

jpa多数据源时Hibernate配置自动生成表不生效_orm.jpa.hibernateproperties' that could not be fou

orm.jpa.hibernateproperties' that could not be found.

jpa配置多数据源教程很多,在Springboot2之后有一些变化,来看一下。

application.yml如下:

  1. spring:
  2. application:
  3. name: t3cc
  4. datasource:
  5. primary:
  6. jdbc-url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${DB_NAME:anbang}?useUnicode=true&characterEncoding=UTF8&serverTimezone=Hongkong
  7. username: root
  8. password: root
  9. secondary:
  10. jdbc-url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/${DB_NAME:anbang1}?useUnicode=true&characterEncoding=UTF8&serverTimezone=Hongkong
  11. username: root
  12. password: root
  13. jpa:
  14. database: mysql
  15. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #不加这句则默认为myisam引擎
  16. hibernate:
  17. ddl-auto: update
  18. naming:
  19. physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
  20. open-in-view: true
  21. properties:
  22. enable_lazy_load_no_trans: true
  23. show-sql: true
  24. cloud:
  25. nacos:
  26. discovery:
  27. server-addr: ${NACOS_SERVER:localhost:8848}
  28. ###############################---log---##############################
  29. logging:
  30. file: ./logback.log

yml里配置了两个数据源,和一些jpa和Hibernate的配置。

下面是DataSource的配置:

  1. /**
  2. * @author wuweifeng wrote on 2019/3/5.
  3. */
  4. @Configuration
  5. public class DataSourceConfig {
  6. @Primary
  7. @Bean(name = "primaryDataSource")
  8. @ConfigurationProperties(prefix = "spring.datasource.primary")
  9. public DataSource dataSourceOrder() {
  10. return DataSourceBuilder.create().build();
  11. }
  12. @Bean(name = "secondaryDataSource")
  13. @ConfigurationProperties(prefix = "spring.datasource.secondary")
  14. public DataSource dataSourceAuth() {
  15. return DataSourceBuilder.create().build();
  16. }
  17. }

下面是第一个数据源的配置:

  1. package com.mm.dmp.t3cc.config;
  2. import org.springframework.beans.factory.annotation.Qualifier;
  3. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
  4. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
  5. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  6. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.context.annotation.Primary;
  10. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  11. import org.springframework.orm.jpa.JpaTransactionManager;
  12. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  13. import org.springframework.transaction.PlatformTransactionManager;
  14. import org.springframework.transaction.annotation.EnableTransactionManagement;
  15. import javax.annotation.Resource;
  16. import javax.persistence.EntityManager;
  17. import javax.sql.DataSource;
  18. /**
  19. * @author wuweifeng wrote on 2019/3/5.
  20. */
  21. @Configuration
  22. @EnableTransactionManagement
  23. @EnableJpaRepositories(
  24. entityManagerFactoryRef = "entityManagerFactoryPrimary",
  25. transactionManagerRef = "transactionManagerPrimary",
  26. basePackages = {"com.mm.dmp.t3cc.core.repository.one"})
  27. public class OneConfig {
  28. @Resource
  29. @Qualifier("primaryDataSource")
  30. private DataSource primaryDataSource;
  31. @Primary
  32. @Bean(name = "entityManagerPrimary")
  33. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  34. return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
  35. }
  36. @Resource
  37. private JpaProperties jpaProperties;
  38. @Resource
  39. private HibernateProperties properties;
  40. /**
  41. * 设置实体类所在位置
  42. */
  43. @Primary
  44. @Bean(name = "entityManagerFactoryPrimary")
  45. public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
  46. LocalContainerEntityManagerFactoryBean entityManagerFactory = builder
  47. .dataSource(primaryDataSource)
  48. //.packages(classes)
  49. //设置实体类所在位置
  50. .packages("com.mm.dmp.t3cc.core.entity.one")
  51. .persistenceUnit("primaryPersistenceUnit")
  52. //.properties(jpaProperties.getProperties())
  53. .properties(properties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()))
  54. .build();
  55. return entityManagerFactory;
  56. }
  57. @Primary
  58. @Bean(name = "transactionManagerPrimary")
  59. public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  60. return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
  61. }
  62. }

这里会和别人的配置不一样,主要区别在于HibernateProperties。别人的在第61行,我注释掉的那行,会直接使用jpaProperties.getProperties()。当你这样写之后,会发现yml里配置的Hibernate的update自动生成表,和命名方式并没有生效。

原因我们可以看一下。

这里就是jpaProperties.getProperties()的地方,如果打断点可以看到,只有箭头这一个配置被加载进去了。上面的Hibernate的ddl和naming并没有进去。

来看一下HibernateProperties

这里才是真正让自动建表生效的地方,然而并没有加载进去。那么就需要我们手工来添加了。

这里面有个determineHibernateProperties方法,就是来组合jpaProperties和HibernateProperties的地方。我们应该使用这个方法来组合整个配置的map对象。

也就是在OneConfig类中,把两个Properties都定义出来,然后组合一下,就是箭头的地方。在debug时,就可以看到Hibernate的配置也都加载进来了。

OK,以上就是动态数据源配置Hibernate自动建表不生效的原因。

下面是第二个数据源的配置

  1. package com.mm.dmp.t3cc.config;
  2. import org.springframework.beans.factory.annotation.Qualifier;
  3. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
  4. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
  5. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  6. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  10. import org.springframework.orm.jpa.JpaTransactionManager;
  11. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  12. import org.springframework.transaction.PlatformTransactionManager;
  13. import org.springframework.transaction.annotation.EnableTransactionManagement;
  14. import javax.annotation.Resource;
  15. import javax.persistence.EntityManager;
  16. import javax.sql.DataSource;
  17. /**
  18. * @author wuweifeng wrote on 2019/3/5.
  19. */
  20. @Configuration
  21. @EnableTransactionManagement
  22. @EnableJpaRepositories(
  23. entityManagerFactoryRef = "entityManagerFactorySecondary",
  24. transactionManagerRef = "transactionManagerSecondary",
  25. basePackages = {"com.mm.dmp.t3cc.core.repository.two"}) //设置Repository所在位置
  26. public class TwoConfig {
  27. @Resource
  28. @Qualifier("secondaryDataSource")
  29. private DataSource secondaryDataSource;
  30. @Resource
  31. private JpaProperties jpaProperties;
  32. @Resource
  33. private HibernateProperties properties;
  34. @Bean(name = "entityManagerSecondary")
  35. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  36. return entityManagerFactorySecondary(builder).getObject().createEntityManager();
  37. }
  38. @Bean(name = "entityManagerFactorySecondary")
  39. public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
  40. LocalContainerEntityManagerFactoryBean entityManagerFactory
  41. = builder
  42. .dataSource(secondaryDataSource)
  43. //.packages(classes)
  44. //设置实体类所在位置
  45. .packages("com.mm.dmp.t3cc.core.entity.two")
  46. .persistenceUnit("secondaryPersistenceUnit")
  47. .properties(properties.determineHibernateProperties(jpaProperties.getProperties(), new
  48. HibernateSettings()))
  49. .build();
  50. return entityManagerFactory;
  51. }
  52. @Bean(name = "transactionManagerSecondary")
  53. public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  54. return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
  55. }
  56. }

如果你觉得这样比较麻烦,并且还有分库分表的需求,那么可以使用sharding jdbc来操作,移步这一篇:https://tianyalei.blog.csdn.net/article/details/98057916

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/52313
推荐阅读
相关标签
  

闽ICP备14008679号