为啥我的 import.sql 文件没有自动运行?

Posted

技术标签:

【中文标题】为啥我的 import.sql 文件没有自动运行?【英文标题】:Why is my import.sql file not automatically running?为什么我的 import.sql 文件没有自动运行? 【发布时间】:2019-12-29 18:13:23 【问题描述】:

正在开发 java spring boot 应用程序。我们的 postgres 数据库是容器化的。我可以让休眠自动创建表,但我不能让它自动运行 import.sql 文件。你能帮我弄清楚这是怎么回事吗?

这里是 build.gradle 文件:

buildscript 
    repositories 
        mavenCentral()
    
    dependencies 
        classpath('org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE')
    



apply plugin: 'application'
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

mainClassName = 'idealab.IdeaLabMain'

bootJar 
    baseName = 'idealab'
    excludeDevtools = false //TODO(e-carlin): In production this should be removed


repositories 
    mavenCentral()


sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies 
    compile('org.springframework.boot:spring-boot-devtools') // TODO(e-carlin): Make sure this isn't pulled in in the production jar
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.postgresql:postgresql')
    testCompile('junit:junit')

这是 application.properties 文件:

logging.level.org.hibernate=DEBUG
debug=true

spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=docker
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
hibernate.hbm2ddl.auto=create # TODO(e-carlin): This will wipe away the
                                     # database data. Good for dev not for prod
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

这是位于 src/main/resources 中的 import.sql 文件:

INSERT INTO color_type (color) VALUES ('blue'),('green'),('purple'),('red');

下面是这个模型的一个例子:

package idealab.api.model;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;



@Entity
@Table(name = "color_type")
public class ColorType 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToMany(targetEntity=PrintModel.class, mappedBy="colorTypeId")   
    private Set<PrintModel> printModel;

    @Column(name = "color", nullable = false)
    private String color;

    public ColorType(Integer id, String color) 

        this.color = color;
    

    //getters and setters
    public String getColor() 
        return color;
    

    public void setColor(String color) 
        this.color = color;
    


感谢您提供的任何帮助!

【问题讨论】:

【参考方案1】:

添加以下属性后尝试,

spring.datasource.initialization-mode=always

如果您使用的是 Spring boot 2,则数据库初始化仅适用于嵌入式数据库(H2、HSQLDB、...)。如果你也想将它用于其他数据库,你需要更改 spring.datasource.initialization-mode 属性:

如果不起作用,请将 sql 文件更改为 data.sql 并尝试。

参考请查看spring-doc

【讨论】:

好吧,我猜import.sql是与springboot无关的hibernate原生特性。如果 hibernate.hbm2ddl.autocreatecreate-drop ,它将被执行。与嵌入式数据库无关...【参考方案2】:

import.sql 是 Hibernate 原生功能,只有在 hibernate.hbm2ddl.auto 设置为 createcreate-drop 时才会执行。

但现在你正在设置:

spring.jpa.generate-ddl=true
hibernate.hbm2ddl.auto=create 
spring.jpa.generate-ddl=true 将在幕后设置hibernate.hbm2ddl.auto=updatehibernate.hbm2ddl.auto=create 无效并且没有任何效果,因为所有有效的 springboot JPA 属性都应该以 spring.jpa 开头

所以最后,hibernate.hbm2ddl.auto 将被设置为 update,因此import.sql 将不会被执行。

您只需将hibernate.hbm2ddl.auto=create 更改为:即可修复它:

spring.jpa.properties.hibernate.hbm2ddl.auto=create

注意:spring.jpa.generate-ddl 将被 spring.jpa.properties.hibernate.hbm2ddl.auto 覆盖,因此您可以简单地删除它。

【讨论】:

感谢您的回答!我已将其切换为您所说的内容,但仍未加载数据。有什么想法吗? @moosespirit94,对不起。我错过了 properties 这个词。它应该是 spring.jpa.properties.hibernate.hbm2ddl.auto=create 。另外请确保 "create" 后没有空格。如果您只是复制我的原始答案,它将包含空间,但休眠不会自动修剪该空间并将其视为无效值。我只是在本地尝试,它按预期工作。 我收到此错误:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/ 中定义名称为“entityManagerFactory”的 bean 创建时出错HibernateJpaConfiguration.class]: init 方法调用失败;嵌套异常是 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory;嵌套异常是 java.lang.IllegalArgumentException: Unrecognized legacy hibernate.hbm2ddl.auto value : create 解决了我的问题 - 创建后我有一个空间。非常感谢您的帮助! 很高兴听到。因此,如果您发现它对您有用,请考虑投票或接受我的答案? ?【参考方案3】:

我们有这些属性来创建记录并将其插入表中。由于您只需要插入记录即可删除spring.datasource.schema

spring.datasource.schema= # Schema (DDL) script resource references.
spring.datasource.data= # Data (DML) script resource references.
无需更改 SQL 文件名 可以将模式生成和插入保持在同一个文件中

可以指定多个文件

spring.datasource.data = classpath:/abc.sql,classpath:/abc2.sql

注意:

对于同一个文件中的模式生成和插入,不要使用spring.datasource.data,我们必须使用spring.datasource.schema 将所有文件保存在 src/main/resources 设置spring.datasource.initialization-mode=always
logging.level.org.hibernate=DEBUG
debug=true

spring.datasource.initialization-mode=always
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=docker
spring.datasource.data = classpath:/import.sql

spring.jpa.database=POSTGRESQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create 
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

【讨论】:

以上是关于为啥我的 import.sql 文件没有自动运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的exe文件没有在其他电脑上运行? [调试]

为啥我的自动化测试在一起运行时会失败,但单独通过?

使用 PostgreSQL 的 Hibernate import.sql 重复主键

tomcat 突然开始自动停止运行。为啥,以前好好的。

我从别人那里拷贝来一个c#的项目,但是没有拷贝数据库文件。为啥这个项目也能正常增删改查?

在hibernate中导入import.sql不成功