【问题标题】:spring.datasource.url how to create multiple enum/domain before hibernate is scanning the entitiesspring.datasource.url 如何在休眠扫描实体之前创建多个枚举/域
【发布时间】:2021-04-18 04:11:48
【问题描述】:

我有使用 pgsql 作为数据库的 spring boot 应用程序。我正在为 api 和测试用例编写测试用例,我正在使用 h2 db。我有多个实体,其中有多个枚举。对于我们有的测试用例

spring.jpa.hibernate.ddl-auto = create-drop

当休眠从实体创建表时,它给出未知数据类型:“enum_type1”。

我从这个问题中得到了一个参考: How to fake ENUM columns in the H2 database for play unit testing?

所以我更新了我的属性如下:

spring.datasource.url= jdbc:h2:mem:test;MODE=PostgreSQL;INIT=CREATE DOMAIN IF NOT EXISTS enum_type1 as VARCHAR(255),CREATE DOMAIN IF NOT EXISTS enum_type2 as VARCHAR(255);DB_CLOSE_ON_EXIT=FALSE

但它给出了以下错误:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "CREATE DOMAIN IF NOT EXISTS enum_type1 AS VARCHAR(255),[*]CREATE DOMAIN IF NOT EXISTS enum_type2 AS VARCHAR(255)"; SQL statement:

那么我们如何在休眠扫描实体之前创建多个枚举/域呢? 任何帮助将不胜感激,谢谢。

【问题讨论】:

标签: java spring-boot hibernate h2


【解决方案1】:

您不能使用逗号作为语句之间的分隔符。如果你想在INIT参数中指定多个语句,它们应该用\;分隔。注意INIT=something参数要和其他参数分开,比如DB_CLOSE_ON_EXIT加上;(不带\)。

jdbc:h2:mem:test;MODE=PostgreSQL;INIT=CREATE DOMAIN IF NOT EXISTS enum_type1 as VARCHAR(255)\;CREATE DOMAIN IF NOT EXISTS enum_type2 as VARCHAR(255);DB_CLOSE_ON_EXIT=FALSE

H2还内置了ENUM data type,用它代替VARCHAR应该会更好。

PostgreSQL兼容模式一般应与DATABASE_TO_LOWER=TRUE一起使用。

使用不同的 DBMS 进行测试和生产的整个想法看起来并不好。通常,只有在您的应用程序最初设计为与它们一起使用时,您才应该使用多个 DBMS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 2017-12-13
    • 2012-08-21
    • 2013-06-10
    • 2016-01-23
    • 2015-03-04
    • 2020-08-17
    相关资源
    最近更新 更多