首页 > 解决方案 > Quarkus - 指定自己的休眠方言以使用 Vlad Mihalcea 的 Json 休眠扩展

问题描述

我目前正在尝试在我的数据库中使用一些 json 类型。

我按照这篇文章试过:

https://vladmihalcea.com/sql-server-json-hibernate/

包括这个之后,我得到了以下异常:

2021-07-13 11:08:07,235 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application (with profile dev): org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:71)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:103)
    at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:404)
    at org.hibernate.mapping.Column.getSqlType(Column.java:238)
    at org.hibernate.mapping.Table.sqlAlterStrings(Table.java:479)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.migrateTable(AbstractSchemaMigrator.java:299)
    at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:75)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:207)
    at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:114)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:192)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:81)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:327)
    at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:73)
    at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:67)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:149)
    at io.quarkus.hibernate.orm.runtime.JPAConfig$1.run(JPAConfig.java:58)
    at java.base/java.lang.Thread.run(Thread.java:834)

然后我尝试按照这篇文章创建自己的方言:

https://vladmihalcea.com/hibernate-no-dialect-mapping-for-jdbc-type/

但我仍然得到同样的例外。我尝试将我自己的类添加到应用程序属性中的方言属性中。但这似乎没有奏效。

有没有办法用 quarkus 来配置它?我担心,我真的不能这样做,因为该物业有关于其限制的免责声明。

编辑:我最初修复了它,因为我删除了数据库模式的自动生成。在我添加了带有触发器的数据库存储的 quarkus-quartz(使用 quarkus.quartz.store-type=JDBC_TX 的集群模式)之后,我现在再次收到此错误。应用程序尝试更新数据库中的触发器(更改计划时间)并引发此错误。

我添加了以下类:

package emilfrey.backend;
import com.vladmihalcea.hibernate.type.json.JsonNodeBinaryType;
import org.hibernate.dialect.SQLServer2012Dialect;

import java.sql.Types;

public class SQLServer2012JsonDialect extends SQLServer2012Dialect {
    public SQLServer2012JsonDialect(){
        super();
        this.registerHibernateType(Types.OTHER, JsonNodeBinaryType.class.getName());

    }
}

并在 application.properties 中添加了以下属性

quarkus.hibernate-orm.dialect = somepackage.backend.SQLServer2012JsonDialect

错误仍然存​​在。我想这与该新类的可用性及其加载有关。但我不确定。有人可以帮我解决这个问题吗?

已经谢谢你了。

标签: hibernatequarkusquarkus-panache

解决方案


我不知道在启用模式生成时解决这个问题。

但是对于禁用模式生成时遇到此问题的任何人,在 Quarkus 开发模式下,这是在 Quarkus 2.4.1 中修复的错误:https ://github.com/quarkusio/quarkus/issues/21122


推荐阅读