【问题标题】:Spring Boot / Data doesn't recreate tablesSpring Boot / Data 不会重新创建表
【发布时间】:2020-02-17 03:18:06
【问题描述】:

我正在尝试配置 Spring Boot / Data 以在应用程序初始化时重新创建表。 为此,我配置了 ddl-auto 来创建。我正在使用两个数据源。

当表不存在时,它们被创建。但是当表存在时,它们不会被重新创建。我认为 ddl-auto create(“创建架构,破坏以前的数据。”)总是会重新创建表。

application.yaml

spring:
   profiles: spring
   jpa:
      generate-ddl: true
      hibernate: 
         ddl-auto: create
      show-sql: true
      properties:
         hibernate:
            dialect: org.hibernate.dialect.MySQL5InnoDBDialect
            format_sql: true

dba:
   datasource:
      url: jdbc:mysql://localhost:3306/DBA
      username: root
      password: 123
      driver-class-name: com.mysql.cj.jdbc.Driver

dbb:
   datasource:
      url: jdbc:mysql://localhost:3306/DBB
      username: root
      password: 123
      driver-class-name: com.mysql.cj.jdbc.Driver

我的配置文件:

@SpringBootApplication
@ComponentScan( basePackages = {"com.example.mds"} )
public class EMdsApplication {

    public static void main(String[] args) {
        SpringApplication.run(EMdsApplication.class, args);
    }

}

DBAConfig.java

@Configuration
@EntityScan(basePackages = {"com.example.mds.model"} )
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "dba_emf",
        transactionManagerRef = "dba_tm",
        basePackages = {"com.example.mds.repository"}
)
public class DBAConfig {


    @Primary
    @Bean(name = "dba_ds")
    @ConfigurationProperties(prefix = "dba.datasource")
    public DataSource dataSource(@Qualifier("dba_dsp") DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Primary
    @Bean(name = "dba_emf")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dba_ds") DataSource datasource) {
        return builder
                  .dataSource(datasource)
                  .packages("com.example.mds.model")
                  .persistenceUnit("dba_pu")
                  .build();
    }

    @Primary
    @Bean(name = "dba_tm")
    public PlatformTransactionManager transactionManager(@Qualifier("dba_emf") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    @Primary
    @Bean(name = "dba_dsp")
    @ConfigurationProperties(prefix = "dba.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }   

}

DBBConfig.java

@Configuration
@EntityScan(basePackages = {"com.example.mds.dbb.model"} )
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "dbb_emf",
        transactionManagerRef = "dbb_tm",
        basePackages = {"com.example.mds.dbb.repository"}
)
public class DBBConfig {

    @Bean(name = "dbb_ds")
    @ConfigurationProperties(prefix = "dbb.datasource")
    public DataSource dataSource(@Qualifier("dbb_dsp") DataSourceProperties properties) {
        return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean(name = "dbb_emf")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("dbb_ds") DataSource datasource) {
        return builder
                  .dataSource(datasource)
                  .packages("com.example.mds.dbb.model")
                  .persistenceUnit("dbb_pu")
                  .build();
    }

    @Bean(name = "dbb_tm")
    public PlatformTransactionManager transactionManager(@Qualifier("dbb_emf") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    @Bean(name = "dbb_dsp")
    @ConfigurationProperties(prefix = "dbb.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }   

}

【问题讨论】:

    标签: java mysql spring-boot spring-data-jpa yaml


    【解决方案1】:

    您需要使用create-drop 属性,以防您要删除和创建表。这应该仅用于测试目的,而不是用于生产用途。 详情参考this问题

    【讨论】:

      【解决方案2】:

      application.yaml 中更改ddl-auto: create to ddl-auto: create-drop
      当会话工厂在应用程序关闭时关闭时,它将删除架构,并在应用程序启动时创建新架构。

      【讨论】:

        【解决方案3】:

        application.yaml 中更改ddl-auto: create to ddl-auto: update

        【讨论】:

        • 更新不要删除并再次创建表。这不是正确的答案。更新选项仅添加新列或创建新表(如果不存在)
        【解决方案4】:

        从我理解的问题来看,您只想在 schme 已经存在时对其进行更新。但是使用您当前的配置,只有在表不存在时才会创建它。如果它们存在,您想要更新表已经存在了。

        请注意确保将此属性仅用于测试场景或开发目的。确保将ddl-auto 设置为none 用于生产环境。

        尝试如下设置application.yml

        spring:
           profiles: spring
           jpa:
              generate-ddl: true
              hibernate: 
                 ddl-auto: update
        

        ddl-auto 的可能值是:

        验证:验证架构,不对数据库进行任何更改。
        更新:更新架构。
        create:创建模式,销毁以前的数据。
        create-drop:在会话结束时删除模式。

        update 操作将查询 JDBC 驱动程序的 API 以获取数据库元数据,然后 Hibernate 将根据读取您的带注释的类或 HBM XML 映射来比较它创建的对象模型,并尝试即时调整架构.

        相关帖子:How does spring.jpa.hibernate.ddl-auto property exactly work in Spring?

        【讨论】:

          猜你喜欢
          • 2021-08-13
          • 2020-01-28
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 2020-05-21
          • 2020-10-22
          • 1970-01-01
          • 2016-10-29
          相关资源
          最近更新 更多