在Spring Boot应用程序中将sql文件放在哪里才能生成H2数据库

问题描述 投票:0回答:3

不清楚将 SQL 文件放在哪里才能初始化我的 H2 数据库。

在我的

application-h2.properties
文件中我有:

# H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2
# Datasource
#spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.url=jdbc:h2:mem:testdb;Mode=Oracle
spring.datasource.platform=h2
spring.datasource.username=user
spring.datasource.password=user
spring.jpa.hibernate.ddl-auto=none
spring.datasource.continue-on-error=true
spring.datasource.initialization-mode=always
spring.datasource.driver-class-name=org.h2.Driver
spring.profiles.active=h2
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect

我的SQL文件是由sqlDeveloper生成的纯oracle SQL。我尝试将其剪切并粘贴到 H2 控制台中,但它不接受。我希望这种方法能够奏效。

------------------------更新1------------------------------------ ----

架构.sql

schema.sql]: CREATE SEQUENCE "foo"."ADDRESSID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE; nested exception is org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE SEQUENCE ""foo"".""ADDRESSID_SEQ"" MINVALUE[*] 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE"; SQL statement:

数据.sql

data.sql]: CREATE SEQUENCE "foo"."ADDRESSID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE; nested exception is org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE SEQUENCE ""foo"".""ADDRESSID_SEQ"" MINVALUE[*] 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE"; SQL statement:
CREATE SEQUENCE "foo"."ADDRESSID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE [42000-148]

错误

Error creating bean with name 'entityManagerFactory': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #3 

这是同一个 sql 文件,我只是重命名了它。它具有创建和插入功能。但是,如果我将其命名为

schema.sql
data.sql
,它仍然会在第三行失败。创建用户或架构时似乎不会失败。

------------------更新2----------------

 CREATE USER foo ifentified by foo;

  CREATE SCHEMA foo;

  CREATE TABLE foo.ADDRESS
   (ADDRESS_ID NUMBER(22,0),
    CUSTOMER_ID NUMBER(*,0),
    COMPANY_NAME VARCHAR2(100 BYTE),
    ADDITIONAL_ADDRESS_INFO VARCHAR2(100 BYTE),
    STREET VARCHAR2(100 BYTE),
    ADDITIONAL_STREET_INFO VARCHAR2(100 BYTE),
    HOUSE_NUMBER VARCHAR2(20 BYTE),
    ZIP VARCHAR2(20 BYTE),
    CITY VARCHAR2(50 BYTE),
    STATE VARCHAR2(20 BYTE),
    COUNTRY_CODE CHAR(2 BYTE),
    PHONE VARCHAR2(20 BYTE),
    CREATED_AT TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
    MODIFIED_AT TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP,
    VALIDATED_AT TIMESTAMP (6),
    VALIDATION_RESULT VARCHAR2(100 CHAR)
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING


   COMMENT ON COLUMN foo.ADDRESS.ADDRESS_ID IS 'primary key for table address';
   COMMENT ON COLUMN foo.ADDRESS.CUSTOMER_ID IS 'foreign key for table customer';
   COMMENT ON COLUMN foo.ADDRESS.CREATED_AT IS 'initially created at';
   COMMENT ON COLUMN foo.ADDRESS.MODIFIED_AT IS 'date of last modification';

错误

Syntax error in SQL statement "CREATE TABLE FOO.ADDRESS (ADDRESS_ID NUMBER(22,0), CUSTOMER_ID NUMBER(*[*],0), COMPANY_NAME VARCHAR2(100 BYTE), ADDITIONAL_ADDRESS_INFO VARCHAR2(100 BYTE), STREET VARCHAR2(100 BYTE), ADDITIONAL_STREET_INFO VARCHAR2(100 BYTE), HOUSE_NUMBER VARCHAR2(20 BYTE), ZIP VARCHAR2(20 BYTE), CITY VARCHAR2(50 BYTE), STATE VARCHAR2(20 BYTE), COUNTRY_CODE CHAR(2 BYTE), PHONE VARCHAR2(20 BYTE), CREATED_AT TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP, MODIFIED_AT TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP, VALIDATED_AT TIMESTAMP (6), VALIDATION_RESULT VARCHAR2(100 CHAR) ) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING COMMENT ON COLUMN FOO.ADDRESS.ADDRESS_ID IS 'primary key for table address' "; expected "long"; SQL statement

spring-boot jpa h2
3个回答
0
投票

您应该将文件命名为

data.sql
并将其保存在src/main/resources文件夹中。在此位置,文件将被自动检测并执行。如果您想要保留默认模式生成(由您的
@Entity
带注释的类定义)。

如果您还想手动生成架构,您可以创建文件

schema.sql
,在其中放置用于创建架构的所有详细信息。


0
投票

更新2后编辑了答案。

你不能使用“

CREATE SEQUENCE "foo"."ADDRESSID_SEQ" ...

所以尝试一下(foo 是模式名称)

CREATE SEQUENCE foo.ADDRESSID_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 20;

不知道能不能用

NOORDER

使用

BIGINT
代替
NUMBER(...)
,请参阅错误中的
...expected "long"...


0
投票

您应该将.sql文件放在资源文件夹中,以便H2数据库将根据您的要求初始化

© www.soinside.com 2019 - 2024. All rights reserved.