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

时间:2014-01-29 05:13:50

标签: spring spring-data spring-boot

我一直在关注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

上投放

3 个答案:

答案 0 :(得分:12)

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

如果你想无条件地运行一个SQL脚本,默认情况下Spring Boot会运行一个独立的Hibernate设置,如果你把它放在classpath:schema.sql(或classpath:schema-<platform>.sql其中<platform>是“postgres” “在你的情况下。”

我认为您可以删除JpaVendorAdapter以及LocalContainerEntityManagerFactoryBean(除非您使用persistence.xml)并让Boot获得控制权。可以使用@EntityScan注释(Spring Boot中的新增内容)设置要扫描的包。

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

答案 1 :(得分:3)

嘿,我遇到过类似的问题。我的sql脚本最初没有被调用。然后我尝试重命名&#34; import.sql&#34; to&#34; schema.sql &#34;,它有效。可能会给这一点。我的代码可以在这里找到 - https://github.com/sidnan/spring-batch-example

答案 2 :(得分:0)

除了已经说过的内容之外,值得注意的是,您可以使用 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将包含整个数据库定义。如果要使用它,请确保Hibernate不会尝试根据项目中的Java实体为您构建数据库。这就是de doc所说的:

  

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