liquibase 异常未知数据类型“JSON”

2023-11-26

我的应用程序使用jhipster与mysql和liquibase,mysql版本是5.7.20,支持json列,我使用对象映射器映射json列和java对象,它可以工作,列类型是json,但是当涉及liquibase时(./mvnw package -Pprod dockerfile:build),会出现“未知数据类型'JSON'”之类的异常测试将失败,不会生成 docker 镜像。

我在 20180410012441_added_entity_Ability.xml 中对该 json 列进行了一些更改:

     <column name="abilities" type="json">
        <constraints nullable="true"/>
    </column>

在我的域类中,json相关字段如下:

@Type(type = "json")
@Column(columnDefinition = "json")
private List<Skill> abilities = new ArrayList<>();

我怀疑问题与 xml 列/类型定义有关,liquibase 不支持 json 关键字,我不知道正确的类型应该有什么。

有人可以帮忙吗?非常感激。

=================================================== ======= 北京时间 9:01 PM 更新 我将更改集添加为“

<changeSet id="20180415081741-1" author="jhipster">
  <sql dbms="mysql" endDelimiter="\nGO" splitStatements="true"
     stripComments="true">ALTER TABLE `ability` ADD `abilities` json DEFAULT NULL</sql>
</changeSet>

然后我发出“./mvnw package -Pprod dockerfile:build”,这是另一个看似与休眠相关的异常:

2018-04-15 20:56:52.186 ERROR 23936 --- [           main] o.h.metamodel.internal.MetadataContext   : HHH015007: Illegal argument on static metamodel field injection : com.james.app.domain.Ability_#abilities; expected type :  org.hibernate.metamodel.internal.SingularAttributeImpl; encountered type : javax.persistence.metamodel.ListAttribute

对于那些即使在定义 TypeDef ...等之后在 H2 和 PostgreSQL 数据库中仍然遇到此问题的人,在执行以下操作后:

@Entity
@TypeDef(name = "jsonb", typeClass = com.vladmihalcea.hibernate.type.json.JsonBinaryType.class)
class SomeEntity {
   // ...
   @Type(type = "jsonb")
   @Column(columnDefinition = "jsonb")
   private List<Skill> abilities = new ArrayList<>();
   // ...
}

您需要通过扩展数据库方言并使用该扩展方言作为方言而不是原始方言来注册类型:

首先定义新的扩展方言:

import org.hibernate.dialect.PostgreSQL10Dialect;
import javax.inject.Inject;

public class AMPostgresDialect
    extends PostgreSQL10Dialect
{
    @Inject
    public AMPostgresDialect()
    {
        super();
        registerColumnType( Types.JAVA_OBJECT, "jsonb" );
    }
}

如果您有用于测试配置文件的 H2 数据库:

import org.hibernate.dialect.H2Dialect;
import java.sql.Types;

public class DhisH2Dialect extends H2Dialect
{
    public DhisH2Dialect()
    {
        super();
        registerColumnType( Types.JAVA_OBJECT, "text" );
        registerColumnType( Types.JAVA_OBJECT, "json" );
    }

然后在应用程序-*.yml在 .properties 文件中,您可以使用这些扩展方言而不是原始方言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

liquibase 异常未知数据类型“JSON” 的相关文章

随机推荐