【问题标题】:LocalContainerEntityManagerFactoryBeanLocalContainerEntityManagerFactoryBean
【发布时间】:2018-10-22 01:38:04
【问题描述】:

我已经浏览了 spring data jpa 参考文档 在 Spring Boot 中配置数据源,并使用 LocalcontainerEntityManagerFactoryBean 和 transactionManager..etc,但运行它 有错误

但是我想配置一个mysql的数据源,单个数据源。 这是配置类代码:

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class DataSourceConfig {

   @Bean

   @ConfigurationProperties(prefix="oneslide.datasource")
   public DataSource dataSource() {

       return DataSourceBuilder.create().build();
   }

   @Bean 
   public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
       HibernateJpaVendorAdapter vendor=new HibernateJpaVendorAdapter();

       vendor.setGenerateDdl(true);

       LocalContainerEntityManagerFactoryBean factory=new LocalContainerEntityManagerFactoryBean();

       factory.setJpaVendorAdapter(vendor);

       factory.setPackagesToScan("com.oneslide.multiDataSource.domain");

       factory.setDataSource(dataSource());

       return factory;

   }

   @Bean 
   public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
       JpaTransactionManager transactionManager=new JpaTransactionManager();
       transactionManager.setEntityManagerFactory(entityManagerFactory);
       return transactionManager;
   }

}

我不希望用户DatasourceBuilder.create.url().password().. 像这样的链调用,我只想在其中配置我的 sql 连接元数据 application.properties with onelide.datasource namespce.并尝试使用 LocalContainerEntityManagerFactory Bean,而不是使用教程的方式 使用 spring.datasource.* 属性。 但是当我运行它时,数据源调试信息为空,它是异常日志的摘要:

init 方法调用失败;嵌套异常是 org.hibernate.service.spi.ServiceException:无法创建请求 服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

: 访问 DialectResolutionInfo 时不能为空 'hibernate.dialect' 未设置

帮帮我,非常感谢。

【问题讨论】:

  • 如果不需要配置类,就使用配置文件...
  • 我想用 javaconfig 配置数据源,并在 application.properties 中外部化自定义命名空间如 oneslide.datasource.url 中的数据源配置,因为我将很快配置多数据源。
  • 关键混淆是我在我的代码中使用了@ConfigurationProperties(prefix="oneslide.datasource"),但它无法加载我的数据源元数据application.properties

标签: java mysql spring-boot


【解决方案1】:

我完全误解了spring boot,也许.....它自动配置所有bean,比如 LocalContainerEntityManagerfactoryBean!所以要使用多数据源,我只需要配置一个数据源,对吧???

【讨论】:

    【解决方案2】:

    您的注解 @ConfigurationProperties(prefix="oneslide.datasource") 要求 Sprint 从外部配置中获取信息并将其与您正在注解的 bean 绑定,即方法产生的结果。

    但是带注释的 bean 必须具有接收配置值的属性。 IE。它必须具有复制您正在传递的配置结构的字段和内部对象(以及设置器)。

    例如,如果您的配置包含以下内容:

    oneslide.datasource.url = some_url
    oneslide.datasource.user = usr
    oneslide.datasource.password = pw
    oneslide.datasource.special.detail = whatever
    

    您构建的 bean 应该具有字段“url”、“user”和“password”以及一个带有字段“detail”的对象“special”,以便 Spring 可以设置这些值。沿着Y = X.getSpecial(); Y.setDetail() 简化一些东西(我想记住也可以识别空值和创建对象)。

    如果你什么都不做...... Spring 在幕后将创建一个 DataSourceProperties bean(不出所料,它包含通常用于在“spring.datasource”下设置配置信息的数据源的字段) .
    您可以通过定义自己的 bean 来获取这个 bean,并将其作为参数获取,如下所示:

    public <whatever> getTheD_S_Properties(DataSourceProperties myDataSourceValesFromConfig) {
        ...do something with the bean you got, 
        that contains the values from your config...
    }
    

    在这种情况下,最常见的操作是自己构建数据源,除了从配置中分配值之外还有一些逻辑。

    如果您不需要做任何特别的事情,那么也让 Spring 来构建数据源。
    坐下来享受吧! :)

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 2016-06-06
      • 2023-03-16
      • 1970-01-01
      • 2011-09-03
      • 2013-07-07
      • 2014-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多