【问题标题】:How to use hibernate-types JsonStringType with MariaDB?如何在 MariaDB 中使用休眠类型的 JsonStringType?
【发布时间】:2021-02-02 00:30:13
【问题描述】:

在之前的项目中,我们在 MySQL 5.7.21 中成功使用了 hibernate-types JsonStringType。这有效(在 Kotlin 中):

@TypeDefs(
    TypeDef(name = "JSON", typeClass = JsonStringType::class)
)
class SomeEntity {
    // ...

    @Type(type = "JSON")
    @Column(nullable = false, columnDefinition = "JSON")
    var data: SomeData = SomeData()
}

在一个新项目中,我们希望使用 MariaDB 10.5.4 做同样的事情。使用 MariaDB,我们在使用 hbm2ddl=validate 进行架构验证时收到以下错误:

SchemaManagementException: Schema-validation: 在表 [some_entity] 的列 [data] 中遇到错误的列类型;找到 [longtext (Types#LONGVARCHAR)],但期待 [json (Types#OTHER)]"。

据我所知,hibernate-types 并未正式支持 MariaDB。在 MariaDB 中,JSON 只是带​​有CHECK (JSON_VALID(column)) 约束的LONGTEXT 的别名。

如果我们使用columnDefinition = "LONGTEXT" 而不是columnDefinition = "JSON",它可以工作,但是,CHECK 约束将不会与hbm2ddl=create 一起生成。

有没有人知道如何两全其美? IE。创建检查约束并通过模式验证?

【问题讨论】:

    标签: json hibernate mariadb hibernate-types


    【解决方案1】:

    如果我们使用 columnDefinition = "LONGTEXT" 而不是 columnDefinition = "JSON",它会起作用,但是,使用 hbm2ddl=create 将不会生成 CHECK 约束。

    hbm2ddl 工具可以很好地生成一个初始迁移脚本,您可以在第一次使用它之前手动调整它。

    之后,您应该将Flyway 与迁移脚本一起使用。

    现在,JsonStringType 应该使用Types.VARCHAR,如JsonStringSqlTypeDescriptor 所示。

    如果不起作用,可能是因为 MariaDB 驱动程序在后台将 JSON 列类型映射到 LONGVARCHAR

    【讨论】:

    • 谢谢,我看看能不能提出一个拉取请求。我们已经在仅在开发和初始生成中使用 hbm2ddl。对于迁移,我们使用 Liquibase。
    • 听起来不错。如果您可以发送 Pull Request,我可以将其集成到下一个版本中。
    • 我看到同样的问题 - 解决方法是什么?找到 [longtext (Types#LONGVARCHAR)],但期待 [json (Types#VARCHAR)]。我的列定义 @Column( columnDefinition = "json" ) @JsonRawValue
    • 对不起,我忽略了。使用 LONGTEXT 而不是 json 和 schmea 验证是好的
    • 对我不起作用:“找到 [longtext (Types#LONGVARCHAR)],但期待 [json (Types#VARCHAR)]”。必须使用 VARCHAR(16384)
    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2012-02-16
    • 1970-01-01
    • 2019-08-26
    • 2021-05-07
    • 2018-06-18
    • 2013-05-30
    • 2023-03-18
    相关资源
    最近更新 更多