代码之家  ›  专栏  ›  技术社区  ›  Drew Wills

得到org.hibernate.MappingException异常:没有JDBC类型1111的方言映射,使用弗拉德米哈尔恰:休眠类型-5

  •  0
  • Drew Wills  · 技术社区  · 7 年前

    我正试图使用此库在JPA&Hibernate中持久化JSON:

    https://github.com/vladmihalcea/hibernate-types

    我下面(每一个有意义的细节)是这篇文章的例子:

    https://vladmihalcea.com/how-to-store-schema-less-eav-entity-attribute-value-data-using-json-and-hibernate/

    这是我(Gradle)的依赖:

    compile 'com.vladmihalcea:hibernate-types-5:2.2.2'
    

    下面是我的实体类的源代码:

    package org.apereo.portal.fbms.data;
    
    import com.fasterxml.jackson.databind.JsonNode;
    import com.vladmihalcea.hibernate.type.json.JsonStringType;
    import org.hibernate.annotations.Type;
    import org.hibernate.annotations.TypeDef;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "FBMS_FORM")
    @TypeDef(
            name = "json",
            typeClass = JsonStringType.class
    )
    public class FormEntity {
    
        @Id
        @GeneratedValue
        private Long id;
    
        @Column(name = "FNAME", nullable = false, unique = true)
        private String fname; // TODO:  Regex-based validator
    
        @Column(name = "VERSION", nullable = false)
        private int version;
    
        @Column(name = "SCHEMA", nullable = false)
        @Type(type = "json")
        private JsonNode schema;
    
        @Column(name = "METADATA")
        @Type(type = "json")
        private JsonNode metadata;
    
        public Long getId() {
            return id;
        }
    
        // Additional getters and setters omitted for brevity...
    
    }
    

    我有个例外:

    Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
            at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371) ~[spring-orm-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336) ~[spring-orm-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1688) ~[spring-beans-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1626) ~[spring-beans-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            ... 16 common frames omitted
    Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
            at org.hibernate.dialect.TypeNames.get(TypeNames.java:70) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.dialect.TypeNames.get(TypeNames.java:101) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:341) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.mapping.Column.getSqlType(Column.java:231) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.mapping.Table.sqlAlterStrings(Table.java:464) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.tool.schema.internal.SchemaMigratorImpl.migrateTable(SchemaMigratorImpl.java:254) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigrationToTargets(SchemaMigratorImpl.java:170) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:60) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:134) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:101) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:472) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
            at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
            at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360) ~[spring-orm-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384) ~[spring-orm-4.3.16.RELEASE.jar:4.3.16.RELEASE]
            ... 20 common frames omitted
    

    如果有帮助的话。。。

    • 我没有包含关于RDBMS平台或JDBC驱动程序的信息;这是有意的——解决方案需要独立于数据库平台。
    • 我将对这个实体使用spring data jpa。
    1 回复  |  直到 6 年前
        1
  •  0
  •   GROX13    6 年前

    解决这个问题的方法,在我的例子中,就是添加自定义的hibernate方言。 This 资源可能会有帮助。创建自定义方言类:

    // CustomPostgreSQLDialect.java
    public class CustomPostgreSQLDialect extends PostgreSQL10Dialect {
    
        public CustomPostgreSQLDialect() {
            super();
            registerHibernateType(Types.OTHER, StringArrayType.class.getName());
            registerHibernateType(Types.OTHER, IntArrayType.class.getName());
            registerHibernateType(Types.OTHER, JsonStringType.class.getName());
            registerHibernateType(Types.OTHER, JsonBinaryType.class.getName());
            registerHibernateType(Types.OTHER, JsonNodeBinaryType.class.getName());
            registerHibernateType(Types.OTHER, JsonNodeStringType.class.getName());
        }
    }
    

    需要在属性中注册您的自定义方言

    # application.yml
    spring:
      jpa:
        properties:
          hibernate:
            dialect: "com.test.CustomPostgreSQLDialect"
    

    如果你需要提供 CustomPostgreSQLDialect 通过 hibernate.dialect 配置属性:

    <property
        name="hibernate.dialect"
        value="com.test.CustomPostgreSQLDialect"
    />
    
        2
  •  0
  •   Vlad Mihalcea    6 年前

    根据触发此异常的操作,您有不同的修复方法。

    在您的例子中,您在引导期间遇到了问题,这意味着Hibernate方言没有 1111 JDBC列类型,代表 Types.OTHER . 因此,您需要使用当前方言进行注册,如下所示:

    public class PostgreSQL95JsonDialect
            extends PostgreSQL95Dialect {
    
        public PostgreSQL95JsonDialect() {
            super();
            this.registerHibernateType(
                Types.OTHER, JsonNodeBinaryType.class.getName()
            );
        }
    }
    

    Ans使用定制的Hibernate方言:

    <property
        name="hibernate.dialect"
        value="com.vladmihalcea.book.hpjp.hibernate.type.json.PostgreSQL95JsonDialect"
    />
    

    如果在执行SQL本机查询时遇到此异常,则需要通过 addScalar :

    JsonNode properties = (JsonNode) entityManager
    .createNativeQuery(
        "SELECT properties " +
        "FROM book " +
        "WHERE isbn = :isbn")
    .setParameter("isbn", "978-9730228236")
    .unwrap(org.hibernate.query.NativeQuery.class)
    .addScalar("properties", JsonNodeBinaryType.INSTANCE)
    .getSingleResult();
    
    assertEquals(
        "High-Performance Java Persistence",
        properties.get("title").asText()
    );
    

    有关此主题的详细信息,请查看 this article 也。

        3
  •  -1
  •   Cepr0    7 年前

    我认为Vlad的库中有一个bug-当我从 json text ( @Column(columnDefinition = "text") )然后一切顺利。

    但我认为你应该 use jsonb 而不是 json格式 . 对于“jsonb”,所有操作都按预期进行:

    @Column(name = "METADATA", columnDefinition = "jsonb")
    @Type(type = "jsonb")
    private JsonNode metadata;
    

    查看我的演示: sb-hibernate-types-demo

    更新

    一种解决方法-使用自定义的Hibernate方言,在这里我注册了列类型 clob 对于代码 Types.OTHER (1111),一切正常。测试时间 H2 HSQLD 数据库。