【问题标题】:Spring Boot JPA base configuration taking precendence over app configurationSpring Boot JPA 基本配置优先于应用程序配置
【发布时间】:2014-02-10 14:30:06
【问题描述】:

上下文:使用 Spring Boot 0.5.0-M7、MySQL 和 Commons DBCP、Java 配置、@EnableAutoConfiguration 设置。

我已经定义了应用程序的DataSource bean、JpaVendorAdapter bean、LocalContainerEntityManagerFactoryBeanTransactionManager bean,并具有特定的配置以支持 DBCP 和一些 Hibernate 设置。在应用程序启动时,DataSource 肯定受到尊重(调试确认),但其他 bean 被忽略。这似乎是JpaBaseConfiguration 类的结果,该类由WebMvcConfiguration 及其安全过滤器之一引入。无论如何,除其他外,问题在于 Hibernate 设置将 hbm2ddl(架构导出)设置为 drop-create,这样每次服务器重新启动时我都会丢失数据。

我查看了源代码,发现似乎可以设置将在JpaBaseConfiguration 中得到尊重的环境变量,但这似乎无法设置 bean 来完成相同的工作。我尝试排除一些与数据相关的自动配置类无济于事。对于设置我可能缺少的非默认数据配置是否还有其他期望?

【问题讨论】:

  • MySQL 的 ddl 设置应为“无”。你确定你没有使用嵌入式数据库吗?
  • 非常确定,我在调试日志中看到了与 MySQL 的连接,我的表有数据,重新启动时它已被删除并重新创建(在 MySQL Workbench 中确认)调试到 SchemaExport 显示了 drop-create 设置生效。我将尝试使用 SNAPSHOT 构建并查看行为是否发生变化。

标签: java spring jpa spring-boot


【解决方案1】:

查看 Spring Boot 0.5.0.M7 检测到休眠时的代码 (HibernateEntityManager) 和 Springs LocalContainerEntityManagerFactoryBean 休眠将始终默认配置。您可以通过将某些属性放在 application.properties 中来覆盖它们。

spring.jpa.hibernate.naming-strategy - 将设置使用的命名策略默认值 = ImprovedNamingStrategyspring.jpa.hibernate.ddl-auto - 将设置 hibernate.hbm2ddl.auto 默认 = create-drop。

您可以设置的一般 JPA 属性

  1. spring.jpa.show-sql - 在日志中显示 sql
  2. spring.jpa.database-platform - 对于休眠,这是方言
  3. spring.jpa.database - 使用的数据库(不要与 database-platform 一起使用!)。
  4. spring.jpa.generate-ddl - 是否应生成 ddl,默认为 false(被 spring.jpa.hibernate.ddl-auto 属性覆盖)

如果你想指定一些非默认属性前缀为spring.jpa.properties,那么它们将被添加到LocalContainterEntityManagerFactoryBeanjpaProperties

HibernateJpaAutoConfiguration 的包含与任何其他配置无关,它只是由检测到某些类触发

@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class,
    EnableTransactionManagement.class, EntityManager.class,
    HibernateEntityManager.class })
@ConditionalOnBean(DataSource.class)
@EnableTransactionManagement

【讨论】:

  • 我认为如果您使用快照,您会发现 JPA 配置中的个人 @Beans 可以通过简单地提供您自己的来覆盖。可能使用 M7,您必须明确排除休眠自动配置。
【解决方案2】:

感谢 @dave-syer 和 @m-deinum 的投入。事实证明 SNAPSHOT 构建成功了,M7 不尊重我自己的 Beans,但现在一切正常。对于后人,我提取了我在应用程序中所做的事情的精髓,并将其应用于 Boot JPA 示例。来源可以找到here。戴夫,如果您认为有更简单的方法可以做到这一点,请告诉我。

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 2014-05-07
    • 2016-06-12
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多