Spring Boot / Spring Data import.sql 不运行 Spring-Boot-1.0.0.RC1

Posted

技术标签:

【中文标题】Spring Boot / Spring Data import.sql 不运行 Spring-Boot-1.0.0.RC1【英文标题】:Spring Boot / Spring Data import.sql doesn't run Spring-Boot-1.0.0.RC1 【发布时间】:2014-02-20 18:13:14 【问题描述】:

我一直在关注 Spring Boot 的开发,有时在初始版本 0.0.5-BUILD-SNAPSHOT 和我正在使用的当前版本 1.0.0.RC1 之间,我不再运行我的 import.sql 脚本。

这是我对LocalContainerEntityManagerJpaVendorAdapter 的配置

@Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) 
        LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(dataSource);
        lef.setJpaVendorAdapter(jpaVendorAdapter);
        lef.setPackagesToScan("foo.*");
        return lef;
    

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() 
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setShowSql(true);
        hibernateJpaVendorAdapter.setGenerateDdl(true);
        hibernateJpaVendorAdapter.setDatabase(Database.POSTGRESQL);
        return hibernateJpaVendorAdapter;
    

有趣的hibernate.hbm2ddl.auto 似乎仍在运行,我认为这是我的SpringBootServletInitializer 定义的一部分

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer 

但是,我也注意到生成的表格不再有 下划线 并且在生成时改变了它们的形状?

但是,这可能是更新我的org.postgresql 版本的结果,如下所示:

以前:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.2-1004-jdbc41</version>
</dependency>

现在:

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.3-1100-jdbc41</version>
</dependency>

我还必须将pggetserialsequence 更改为pg_get_serial_sequence 才能让脚本完全从pgadmin 运行?

我想我对正在发生的事情感到困惑,但最重要的是我想回到让我的 import.sql 运行。

我一直在关注示例项目:https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-data-jpa

他们的import.sql 也没有在1.0.0-BUILD-SNAPSHOT 上运行

【问题讨论】:

【参考方案1】:

import.sql 脚本是我认为的 Hibernate 功能(不是 Spring 或 Spring Boot)。它必须在示例中运行,否则测试将失败,但无论如何,它仅在设置 ddl-auto 以创建表时运行。使用 Spring Boot,您应该确保将 spring.jpa.hibernate.ddl-auto 设置为“create”或“create-drop”(后者是 Boot 中嵌入式数据库的默认设置,但不适用于其他数据库,例如 postgres)。

如果您想无条件地运行 SQL 脚本,默认情况下,如果您将其放入 classpath:schema.sql(或 classpath:schema-&lt;platform&gt;.sql,其中 &lt;platform&gt; 在您的情况下为“postgres”),Spring Boot 将运行一个独立于 Hibernate 设置的脚本。

我认为您可能可以删除JpaVendorAdapterLocalContainerEntityManagerFactoryBean(除非您使用persistence.xml)并让引导控制。可以使用 @EntityScan 注释(Spring Boot 中的新功能)设置要扫描的包。

Boot 1.0.0.RC1 中更改了默认表命名方案(因此与您的 postgres 依赖项无关)。我不确定在 RC2 中是否仍然如此,但无论如何你可以通过设置 spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy 回到旧的 Hibernate 默认值。

【讨论】:

感谢 Dave,我看到了您对项目的所有贡献!我非常感谢您抽出时间向我指出这一点。 ...如果spring.jpa.hibernate.ddl-auto=update,则import.sql 将不会运行。【参考方案2】:

嘿,我遇到了类似的问题。我的 sql 脚本最初没有被调用。然后我尝试将文件从“import.sql”重命名为“schema.sql”,它成功了。可以试一试。我的代码可以在这里找到 - https://github.com/sidnan/spring-batch-example

【讨论】:

【参考方案3】:

除了已经说过的内容之外,值得注意的是,您可以使用 data.sql 文件将数据导入/初始化到表中。只需将您的 data.sql 放入类路径的根目录(例如:如果您正在运行 Spring Boot 应用程序,则将其放入 src/main/resources 路径)。

如前所述,将其与属性 ddl-auto=create-drop 一起使用,这样在尝试插入现有数据时不会崩溃。

您还可以使用 spring.datasource.data 属性设置要执行的特定文件。在此处查看更多信息:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

注意:前面提到的 schema.sql 将包含整个 DB 定义。如果您想使用它,请确保 Hibernate 不会尝试根据您项目中的 Java 实体为您构建数据库。这是de doc所说的:

如果您想在 JPA 应用程序中使用 schema.sql 初始化(使用 Hibernate) 那么 ddl-auto=create-drop 如果 Hibernate 会导致错误 尝试创建相同的表。为了避免这些错误设置 ddl-auto 明确地“”(首选)或“无”

【讨论】:

以上是关于Spring Boot / Spring Data import.sql 不运行 Spring-Boot-1.0.0.RC1的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + spring-data-redis

Spring Boot 整合Spring Data JPA

Spring Boot 在使用 solrj 而不是 spring-boot-starter-data-solr 时会爆炸

spring boot系列spring boot 配置spring data jpa (查询方法)

Spring boot集成spring-boot-starter-data-jpa环境搭建

spring boot -spring data-redis