【问题标题】:Executing H2 under Spring BootSpring Boot下执行H2
【发布时间】:2017-08-01 05:03:30
【问题描述】:

我使用 Spring Initializer、嵌入式 Tomcat、Thymeleaf 模板引擎生成了一个 Spring Boot Web 应用程序,并将其打包为可执行 JAR 文件。

使用的技术:

Spring Boot 1.4.2.RELEASE、Spring 4.3.4.RELEASE、Thymeleaf 2.1.5.RELEASE、Tomcat 嵌入 8.5.6、Maven 3、Java 8

这是我在启动 DB 时调用的 bean

@SpringBootApplication
@EnableAutoConfiguration
@Import({SecurityConfig.class})
public class BookApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookApplication.class, args);
    }
}



@Configuration
public class PersistenceConfig {

...

    /**
         * Creates an in-memory "books" database populated 
         * with test data for fast testing
         */
        @Bean
        public DataSource dataSource(){
            return
                (new EmbeddedDatabaseBuilder())
                .addScript("classpath:db/H2.schema.sql")
                .addScript("classpath:db/H2.data.sql")
                .build();
        }

当我在

中执行此插入时
CREATE TABLE IF NOT EXISTS t_time_lapse (
      id          bigint  PRIMARY KEY,
      name        varchar(50) NOT NULL,
      description varchar(200) NOT NULL,
      sunday      boolean DEFAULT NULL,
      monday      boolean DEFAULT NULL,
      tuesday     boolean DEFAULT NULL,
      wednesday   boolean DEFAULT NULL,
      thursday    boolean DEFAULT NULL,
      friday      boolean DEFAULT NULL,
      saturday    boolean DEFAULT NULL,
      init_period date    NOT NULL ,
      end_period  date    NOT NULL ,
      init_time   time    DEFAULT NULL,
      end_time    time    DEFAULT NULL,
      company_id  bigint DEFAULT NULL,
      FOREIGN KEY (company_id)     REFERENCES public.t_company(id)
 );



insert into T_TIME_LAPSE (ID, NAME, DESCRIPTION, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, INIT_PERIOD, END_PERIOD, INIT_TIME, END_TIME, COMPANY_ID) 
    values (9090,'key', 'key', 1,1,1,1,1,1,1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), 1);

我收到了这个错误

user lacks privilege or object not found: PARSEDATETIME

在数据源资源管理器中执行相同的查询 -> 数据库连接 -> SQL Scrapbook 一切都很好!

在脚本中添加SHOW CREATE FUNCTION PARSEDATETIME

Failed to execute SQL script statement #1 of class path resource [db/H2.data.sql]: SHOW CREATE FUNCTION PARSEDATETIME; nested exception is java.sql.SQLSyntaxErrorException: unexpected token: SHOW

CREATE FUNCTION PARSEDATETIME;

Failed to execute SQL script statement #1 of class path resource [db/H2.data.sql]: CREATE FUNCTION PARSEDATETIME; nested exception is java.sql.SQLSyntaxErrorException: unexpected end of statement:  required: (

以及建议的示例:

Failed to execute SQL script statement #2 of class path resource [db/H2.data.sql]: INSERT INTO test values (1, CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT')); nested exception is java.sql.SQLSyntaxErrorException: unexpected token: CALL

【问题讨论】:

  • gitter.im/spring-projects/spring-boot提问并更新答案
  • 除此之外:您不使用 autoconfig 是否有特殊原因?
  • 你的意思是 EnableAutoConfiguration 吗?
  • 您的T_TIME_LAPSE 架构是什么?请添加 DDL。
  • 我测试过,它适用于 TIMESTAMP 列。 CREATE TABLE test ( id INT NOT NULL, birthday TIMESTAMP ); INSERT INTO test values (1, CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT')); 在 data.sql 上

标签: mysql spring spring-mvc spring-boot h2


【解决方案1】:

由于某种原因,安装了存储函数PARSEDATETIME die 不允许您访问它。请提供SHOW CREATE FUNCTION PARSEDATETIME。看看春天的东西。

或者,更可能的是,PARSEDATETIME 是 Java 函数,而不是 MySQL 函数。

注意:你使用它的地方暗示它是一个 MySQL 函数。要将其用作 Java 函数,您需要将其“绑定”到 INSERT

【讨论】:

    【解决方案2】:

    您是否尝试从

    更改您的插入语句
    insert into T_TIME_LAPSE (ID, NAME, DESCRIPTION, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, INIT_PERIOD, END_PERIOD, INIT_TIME, END_TIME, COMPANY_ID) 
    values (9090,'key', 'key', 1,1,1,1,1,1,1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), 1);
    

    insert into T_TIME_LAPSE (ID, NAME, DESCRIPTION, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, INIT_PERIOD, END_PERIOD, INIT_TIME, END_TIME, COMPANY_ID) 
    values (9090,'key', 'key', 1,1,1,1,1,1,1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), 1);
    

    ?

    【讨论】:

    • 正如@Liping huang 建议的那样,您能否将架构脚本 (H2.schema.sql) 中包含的 DDL 内容添加到您的帖子中?谢谢。
    【解决方案3】:

    我尝试通过使用 spring-boot-starter-data-jpah2 依赖项从头开始创建 Spring Boot 项目来重现您的问题。我做了两件事:

    1) 将您的脚本放在/resources 中,名称为schema.sqldata.sql,以便相应地创建和填充数据库。默认情况下,Spring Boot 将从这些位置加载 SQL,如 here 所述。

    2) 我在application.properties 中配置了testdb H2 数据库,如下所示:

    # H2 database configuration
    spring.datasource.url = jdbc:h2:file:~/testdb;DB_CLOSE_ON_EXIT=FALSE
    
    # Enable SQL script scanning in /resources folder
    spring.jpa.hibernate.ddl-auto=none
    
    # Enable H2 console under http://localhost:8080/console/ for dev purposes
    spring.h2.console.enabled=true
    spring.h2.console.path=/console/
    

    结果是 H2 数据库由您提供的示例数据填充没有任何错误(我没有像您在 PersistenceConfig 中那样配置 DataSource,仅此而已/仅此而已)。

    如果您想坚持使用自定义 SQL 脚本位置,请考虑按照此答案 https://stackoverflow.com/a/41644743/2402959 配置您的 DataSource

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2019-05-09
      • 2017-01-16
      • 2018-12-31
      • 2020-03-08
      • 1970-01-01
      • 2014-04-07
      • 2019-04-01
      相关资源
      最近更新 更多