不清楚将 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
:
您应该将文件命名为
data.sql
并将其保存在src/main/resources文件夹中。在此位置,文件将被自动检测并执行。如果您想要保留默认模式生成(由您的 @Entity
带注释的类定义)。
如果您还想手动生成架构,您可以创建文件
schema.sql
,在其中放置用于创建架构的所有详细信息。
更新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"...
。
您应该将.sql文件放在资源文件夹中,以便H2数据库将根据您的要求初始化