Spring Boot/Spring Data import.sql不';t运行Spring-Boot-1.0.0.RC1
我一直在关注Spring Boot的开发,在初始版本Spring Boot/Spring Data import.sql不';t运行Spring-Boot-1.0.0.RC1,spring,spring-data,spring-boot,Spring,Spring Data,Spring Boot,我一直在关注Spring Boot的开发,在初始版本0.0.5-BUILD-SNAPSHOT和当前版本1.0.0.RC1之间的某个时间,我不再运行我的import.sql脚本 这是我对LocalContainerEntityManager和JpaVendorAdapter @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory( DataSource dataSource,
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>
org.postgresql
他们的import.sql
也没有在1.0.0-BUILD-SNAPSHOT
上运行import.sql
脚本是一个休眠特性,我认为(不是Spring或Spring引导)。它必须在示例中运行,否则测试将失败,但在任何情况下,它仅在设置ddl auto以创建表时运行。使用Spring引导时,您应该确保Spring.jpa.hibernate.ddl auto
设置为“创建”或“创建删除”(后者是嵌入式数据库引导时的默认值,但不适用于其他数据库,例如postgres)
如果您希望无条件地运行SQL脚本,默认情况下,如果您将它放在classpath:schema.SQL
(或者classpath:schema-.SQL
中,其中
在您的情况下是“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默认设置。嘿,我遇到了类似的问题。我的sql脚本最初没有被调用。然后,我尝试将文件从“import.sql”重命名为“schema.sql”,结果成功了。也许可以试一试。我的代码可以在这里找到-除了前面所说的,值得注意的是,您可以使用data.sql文件将数据导入/初始化到表中。只需将data.sql放在类路径的根目录中(例如:如果您正在运行Spring Boot应用程序,则将其放在src/main/resources路径中)
如前所述,将其与属性ddl auto=create drop一起使用,这样它在插入现有数据时不会崩溃
您还可以使用spring.datasource.data属性设置要执行的特定文件。请在此处查看更多信息:
注意:前面提到的schema.sql将包含整个DB定义。如果您想使用它,请确保Hibernate不会试图基于项目中的Java实体为您构建DB。de doc是这么说的:
如果要在JPA应用程序中使用schema.sql初始化(使用
Hibernate)则ddl auto=create drop在休眠时将导致错误
尝试创建相同的表。要避免这些错误,请设置ddl auto
明确指定为“”(优选)或“无”
谢谢戴夫,我看到你对这个项目的贡献了!我真的很感谢你抽出时间向我指出这一点。。。。如果spring.jpa.hibernate.ddl auto=update
,那么import.sql
将不会运行。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1100-jdbc41</version>
</dependency>