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
脚本。
这是我对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>
我还必须将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-<platform>.sql
,其中 <platform>
在您的情况下为“postgres”),Spring Boot 将运行一个独立于 Hibernate 设置的脚本。
我认为您可能可以删除JpaVendorAdapter
和LocalContainerEntityManagerFactoryBean
(除非您使用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 在使用 solrj 而不是 spring-boot-starter-data-solr 时会爆炸
spring boot系列spring boot 配置spring data jpa (查询方法)