如何使用 JDBC 为 Spring 引导会话自动初始化 H2 数据库模式
How do you auto initialize H2 db schema for Spring Boot sessions using JDBC
当我 运行 我的 Spring 启动应用程序时,它不执行 schema.sql 脚本。有什么地方我做错了吗?
application.properties:
spring.security.user.name=user
spring.security.user.password=asdf
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.session.store-type=jdbc
spring.session.jdbc.initialize-schema=always
我也试过将这个添加到我的 application.properties
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-h2.sql
build.gradle
dependencies {
implementation('org.springframework.session:spring-session-jdbc')
implementation('org.springframework.boot:spring-boot-starter-data-rest')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.session:spring-session-jdbc')
runtimeOnly('com.h2database:h2')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.security:spring-security-test')
}
schema.sql
DROP TABLE IF EXISTS SPRING_SESSION_ATTRIBUTES;
DROP TABLE IF EXISTS SPRING_SESSION;
CREATE TABLE SPRING_SESSION (
PRIMARY_ID CHAR(36) NOT NULL,
SESSION_ID CHAR(36) NOT NULL,
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
EXPIRY_TIME BIGINT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
);
CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_PRIMARY_ID CHAR(36) NOT NULL,
ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
ATTRIBUTE_BYTES LONGVARBINARY NOT NULL,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
);
Spring 版本:2.1.0
调试你的应用程序后,它似乎工作正常,schema.sql也执行了但你需要有 DEBUG 级别
添加
logging.level.root=DEBUG
并查看日志:
您是否关闭了 hibernate ddl-auto 选项?如果不把这个放在你的 application.properties
spring.jpa.hibernate.ddl-auto=none
spring docs 中的第 85.3 节说
In a JPA-based app, you can choose to let Hibernate create the schema
or use schema.sql, but you cannot do both. Make sure to disable
spring.jpa.hibernate.ddl-auto if you use schema.sql.
您可以同时使用休眠 auto-create 和 schema.xml,并且您可能需要同时使用两者,但它们不应重叠。如果您在 application.xml
中声明一个默认的休眠模式:
spring:
jpa:
hibernate:
ddl-auto: create-drop
default_schema: NASA_SPACE_0
...hibernate 不创建模式 NASA_SPACE_0,因此 schema.xml
是该语句的理想位置,并且它与 hibernate 的 ddl-auto 创建一起工作:
create schema `NASA_SPACE_0`;
当我 运行 我的 Spring 启动应用程序时,它不执行 schema.sql 脚本。有什么地方我做错了吗?
application.properties:
spring.security.user.name=user
spring.security.user.password=asdf
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.session.store-type=jdbc
spring.session.jdbc.initialize-schema=always
我也试过将这个添加到我的 application.properties
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-h2.sql
build.gradle
dependencies {
implementation('org.springframework.session:spring-session-jdbc')
implementation('org.springframework.boot:spring-boot-starter-data-rest')
implementation('org.springframework.boot:spring-boot-starter-jdbc')
implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.session:spring-session-jdbc')
runtimeOnly('com.h2database:h2')
testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.security:spring-security-test')
}
schema.sql
DROP TABLE IF EXISTS SPRING_SESSION_ATTRIBUTES;
DROP TABLE IF EXISTS SPRING_SESSION;
CREATE TABLE SPRING_SESSION (
PRIMARY_ID CHAR(36) NOT NULL,
SESSION_ID CHAR(36) NOT NULL,
CREATION_TIME BIGINT NOT NULL,
LAST_ACCESS_TIME BIGINT NOT NULL,
MAX_INACTIVE_INTERVAL INT NOT NULL,
EXPIRY_TIME BIGINT NOT NULL,
PRINCIPAL_NAME VARCHAR(100),
CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
);
CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);
CREATE TABLE SPRING_SESSION_ATTRIBUTES (
SESSION_PRIMARY_ID CHAR(36) NOT NULL,
ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
ATTRIBUTE_BYTES LONGVARBINARY NOT NULL,
CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
);
Spring 版本:2.1.0
调试你的应用程序后,它似乎工作正常,schema.sql也执行了但你需要有 DEBUG 级别
添加
logging.level.root=DEBUG
并查看日志:
您是否关闭了 hibernate ddl-auto 选项?如果不把这个放在你的 application.properties
spring.jpa.hibernate.ddl-auto=none
spring docs 中的第 85.3 节说
In a JPA-based app, you can choose to let Hibernate create the schema or use schema.sql, but you cannot do both. Make sure to disable spring.jpa.hibernate.ddl-auto if you use schema.sql.
您可以同时使用休眠 auto-create 和 schema.xml,并且您可能需要同时使用两者,但它们不应重叠。如果您在 application.xml
中声明一个默认的休眠模式:
spring:
jpa:
hibernate:
ddl-auto: create-drop
default_schema: NASA_SPACE_0
...hibernate 不创建模式 NASA_SPACE_0,因此 schema.xml
是该语句的理想位置,并且它与 hibernate 的 ddl-auto 创建一起工作:
create schema `NASA_SPACE_0`;