2014-01-29 75 views
4

我一直在关注Spring Boot的开发,并且在最初版本0.0.5-BUILD-SNAPSHOT和当前版本之间的某个时间我使用1.0.0.RC1我不再运行我的import.sql脚本。Spring Boot/Spring Data.sql不运行Spring-Boot-1.0.0.RC1

这里是我的LocalContainerEntityManager配置和JpaVendorAdapter

@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> 

我也不得不改变pggetserialsequencepg_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

回答

12

import.sql脚本运行的是一个是休眠功能,我认为(不春季或春季启动)。它必须在样本中运行,否则测试将失败,但无论如何它只有在ddl-auto被设置为创建表时才会运行。使用Spring Boot时,应确保spring.jpa.hibernate.ddl-auto设置为“create”或“create-drop”(后者是嵌入式数据库引导的默认值,但不适用于其他人,例如postgres)。

如果要无条件地运行SQL脚本,默认情况下,春季启动将运行的休眠设置一个独立的,如果你把它放在classpath:schema.sql(或classpath:schema-<platform>.sql其中<platform>你的情况“的Postgres”)。

我想你大概可以删除JpaVendorAdapterLocalContainerEntityManagerFactoryBean(除非你使用的是persistence.xml)并且让Boot控制。要扫描的软件包可以使用@EntityScan注释(Spring Boot中的新增功能)进行设置。

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

+0

谢谢戴夫,我看到您对该项目的所有贡献!我真的很感激你花时间向我指出这一点。 –

+0

...如果'spring.jpa.hibernate.ddl-auto = update',那么'import.sql'将不会运行。 – Abdull

3

嘿,我遇到过类似的问题。我的sql脚本最初没有被调用。然后我尝试将文件从“import.sql”重命名为“模式”。SQL”,它的工作可能是给这一个镜头我的代码可以在这里找到。 - https://github.com/sidnan/spring-batch-example

0

除了什么已经说了,这是值得注意的,你可以使用data.sql文件导入/首先将data.sql放入类路径的根目录中(例如:如果您运行的是Spring Boot应用程序,则将其放入路径中)。就像之前说过的一样,将它与属性一起使用ddl-auto =创建 - 删除,以便它不会试图插入现有数据时崩溃。

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

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

如果你想使用的应用程序JPA的schema.sql文件初始化(与 休眠)然后DDL-AUTO =创建降会导致错误,如果休眠 尝试创建相同的表格。为了避免这些错误,将ddl-auto 明确设置为“”(优选)或“none”