如何使用 JDBC 为 Spring 引导会话自动初始化 H2 数据库模式

How do you auto initialize H2 db schema for Spring Boot sessions using JDBC

当我 运行 我的 Spring 启动应用程序时,它不执行 schema.sql 脚本。有什么地方我做错了吗?

Complete code here

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`;