当前位置: 首页 > 知识库问答 >
问题:

Hsql -如果spring boot应用程序中不存在模式,则创建模式

许俊贤
2023-03-14

我在我的Spring启动应用程序中使用嵌入式hsql db,并且仅当db中不存在时才想创建架构。

假设模式名称为XXX,

我有下面的单语句模式hsql。sql文件:

CREATE SCHEMA XXX IF NOT EXISTS

然而,这与下面的堆栈跟踪有关:

org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of URL [file:/xxx/schema-hsql.sql]: CREATE SCHEMA XXX IF NOT EXISTS; nested exception is java.sql.SQLSyntaxErrorException: unexpected token: IF

at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:494)
    at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:231)
    at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:48)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.runScripts(DataSourceInitializer.java:157)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.runSchemaScripts(DataSourceInitializer.java:81)
    at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.init(DataSourceInitializer.java:75)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:354)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:305)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:133)
    ... 65 more
Caused by: java.sql.SQLSyntaxErrorException: unexpected token: IF
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
    at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:909)
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:473)
    ... 77 more
Caused by: org.hsqldb.HsqlException: unexpected token: IF
    at org.hsqldb.error.Error.parseError(Unknown Source)
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source)
    at org.hsqldb.ParserDDL.getCompiledStatementBody(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreateSchema(Unknown Source)
    at org.hsqldb.ParserDDL.compileCreate(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
    at org.hsqldb.Session.executeDirectStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 81 more

实现这一点的正确语法是什么?

谢谢

共有2个答案

邢华清
2023-03-14

您还可以在“hibernate.cfg.xml”中指定如下:

<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>

以下是完整的示例:

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">org.h2.Driver</property>
    <property name="connection.url">jdbc:h2:file:db/personh2db;DB_CLOSE_DELAY=-1;MVCC=TRUE</property>
    <property name="connection.username">sa</property>
    <property name="connection.password"/>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.H2Dialect</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>

    <mapping resource="com/example/model/Person.hbm.xml"/>

</session-factory>

hbm2ddl.auto的可能选项列表是,

    < li >验证:验证模式,不对数据库进行任何更改。 < li >更新:更新模式。 < li >创建:创建模式,销毁以前的数据。 < li >创建-删除:在会话结束时删除架构。

您可以在<code>应用程序中配置Hibernate属性。属性。

这是application.properties的留档:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

您可以找到hbm2ddl的示例。此处自动配置:http://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-配置jpa属性

巫马安怡
2023-03-14

使用

CREATE SCHEMA IF NOT EXISTS XXX

而不是你的 SQL

CREATE SCHEMA XXX IF NOT EXISTS

并使用org.hsqldb::hsqldb v.2.4.0

请参见:Hsql-如果在Spring启动应用程序中不存在,则创建架构

 类似资料:
  • 我正在研究springboot2应用程序,并试图通过配置hikari数据源和springJpa来建立与postgresql数据库的连接。 我成功了,我正在使用作为,因此如果不存在,它将创建表,但唯一的问题是当架构不存在时它会引发异常 错误 我通过配置类手动配置了一切 配置类 如果不存在,我该如何创建架构? 我在这里看到了一个类似的问题,并尝试了所有迄今为止没有运气的类似问题(我不想使用flyway

  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 我想让表位于不同的数据库模式中。但不幸的是,我不能用Spring靴实现这一点。这里的步骤是再现它。 运行生成的测试或主类。确保一切正常。 修改实体,将属性添加到注释中。现在该实体看起来像: 完整的日志列表可在以下站点获得:https://gist.github.com/asaushkin/8d767c92b2e7025dd359f7be43eefdd6 我的问题是:为什么Schema不是由Spri

  • 问题内容: 我被要求为一个很大的SpringBoot项目中的服务创建一个集成测试,该项目会产生许多已实现的服务。执行该应用程序时,将部署所有这些服务- 我想避免部署与我正在为其创建测试的服务无关的所有服务。不幸的是,我对弹簧启动测试的经验还不如我所希望的那么多,因此我想知道解决这个问题的最佳方法是什么。 我当时正在考虑使用注解对所有不相关的服务进行注释,并在测试类中对所有相关的服务进行注释,但是我

  • 问题内容: 我正在使用PostgreSQL,并且是SQL的初学者。我正在尝试从查询创建表,并且如果运行: 它工作正常。但是然后如果我添加“如果不存在”并运行: 使用完全相同的查询,我得到: 有什么办法吗? 问题答案: CREATE TABLE AS被认为是与普通CREATE TABLE 分开的语句,并且 直到Postgres版本9.5 (请参阅changelog条目)不支持子句 为止 。(请务必查

  • 问题内容: 创建新表时遇到一些问题。当我使用CREATE TABLE命令时,我的新表将按应有的形式出现,但是当我退出活动时,应用程序崩溃,并且在logcat中得到了一个表已经存在的信息。如果我使用CREATE TABLE IF NOT EXISTS不存在,则不会形成新表,而只是将新的数据行添加到上一个表中,并且不会崩溃。这有什么问题?我想添加没有它的表,让我已经存在,并且我想要添加它而不向其他表添