【问题标题】:Spring Boot dont read data.sql but it read import.sqlSpring Boot 不读取 data.sql 但读取 import.sql
【发布时间】:2018-03-20 23:55:10
【问题描述】:

我想在 spring 创建表之后导入 DML 脚本。 我正在处理 data.sql 文件,但我的应用程序看不到它。 我不知道为什么。当我将 data.sql 重命名为 import.sql 时,它可以工作,但 它也应该与 data.sql 一起工作

有人知道为什么吗?

我的 application.properties:

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:postgresql://localhost:5432/yyy
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=org.postgresql.Driver

我将data.sql 放入src/main/resources

resources中只有data.sql时:

2018-03-21 00:42:13.646  INFO 4740 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@eebc0db'

只有 import.sql 时(也在src/main/resources):

2018-03-21 00:48:57.023  INFO 16600 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'ScriptSourceInputFromUrl(file:/C:/Users/Pawel/Desktop/Project/target/classes/import.sql)'

当我在application.properties 中输入spring.datasource.data=data.sql

Exception in thread "SimpleAsyncTaskExecutor-2" org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException: Property spring.datasource.data with value 'ServletContext resource [/data.sql]' is invalid: The specified resource does not exist.
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.getResources(DataSourceInitializer.java:169)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.getScripts(DataSourceInitializer.java:151)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.initSchema(DataSourceInitializer.java:114)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker.onApplicationEvent(DataSourceInitializerInvoker.java:93)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker.onApplicationEvent(DataSourceInitializerInvoker.java:37)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.lambda$multicastEvent$0(SimpleApplicationEventMulticaster.java:136)
    at java.lang.Thread.run(Thread.java:745)

我可以在target/classes/data.sqltarget/classes/import.sql 中看到data.sqlimport.sql ...

【问题讨论】:

    标签: spring hibernate spring-boot spring-data-jpa


    【解决方案1】:

    如果你将 data.sql 放在 jar 中,则在其名称前加上 classpath 或 META-INF

    spring.datasource.data=classpath:/data.sql
    
    spring.datasource.data=/META-INF/data.sql
    

    (我不能 100% 确定,所以如果您尝试两种解决方案并给我反馈,那就太好了)

    【讨论】:

    • 嗨,谢谢你的回答:) 首先,我在文档中读到它应该可以在没有 spring.datasource.data 的情况下工作,但是......使用第一个选项我得到了'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@eebc0db'。我得到的第二个:'ServletContext resource [/META-INF/data.sql]' is invalid: The specified resource does not exist.
    【解决方案2】:

    您必须通过注释您的行 spring.jpa.hibernate.ddl-auto=create-drop 并将其设置为验证来停用 Hibernate 加载(来自 import.sql)。 然后添加spring.datasource.initialization:

    spring.datasource.initialization-mode=always
    spring.jpa.hibernate.ddl-auto=validate
    

    【讨论】:

      【解决方案3】:

      如果有人遇到这个问题,我就是这样做的:

      applications.properties:

      Oracle 设置

      spring.datasource.url = jdbc:oracle:thin:@localhost:1521:xe<br>
      spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver<br>
      spring.datasource.username=xxxx<br>
      spring.datasource.password=xxxx<br>
      spring.jpa.hibernate.ddl-auto=none<br>
      spring.datasource.initialization-mode=always<br>
      spring.datasource.platform=oracle<br>
      

      MYSQL 设置

      spring.datasource.url = jdbc:mysql://localhost:3306/mysql<br>
      spring.datasource.username = xxxx<br>
      spring.datasource.password = xxxx<br>
      spring.jpa.hibernate.ddl-auto=none<br>
      spring.datasource.initialization-mode=always<br>
      spring.datasource.platform=mysql<br>
      

      帮助我的行是添加最后 2 行,还请记住,您必须有一个分别名为“data-oracle.sql”或“data-mysql.sql”的文件。

      这里是来源:
      https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html#howto-initialize-a-database-using-spring-jdbc

      【讨论】:

        【解决方案4】:

        当首选 naXa 时为我工作:

        spring.datasource.data=classpath:/data.sql

        【讨论】:

          猜你喜欢
          • 2019-03-15
          • 1970-01-01
          • 1970-01-01
          • 2014-02-20
          • 2018-01-31
          • 2019-08-14
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多