我一直在关注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
跑步。
他们的import.sql
未在1.0.0-BUILD-SNAPSHOT
答案 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 明确地“”(优选)或“无”