java - 获取 org.hibernate.MappingException:没有 JDBC 类型的方言映射:1111 使用 com.vladmihalcea:hibernate-types-5
问题描述
我正在尝试使用这个库通过 JPA 和 Hibernate 来持久化 JSON:
https://github.com/vladmihalcea/hibernate-types
我正在关注(在每个有意义的细节中)本文中的示例:
这是我的(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。
解决方案
根据触发此异常的操作,您有不同的方法来修复它。
在您的情况下,您在引导期间遇到了问题,这意味着 Hibernate Dialect 没有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()
);
有关此主题的更多详细信息,请查看这篇文章。
推荐阅读
- r - 使用 ggplot 绘制闪亮的反应数据
- c - 将指针的地址而不是指针作为函数参数传递
- sql-server - 在 Order By 子句中调用存储过程
- python - 在 Python Tkinter 中单击要显示为复选框的文本
- javascript - 试图通过反应发出命令来赋予角色。- 不和谐.js
- python - 如何从包含大约 200 个国家的数据集中制作干净的时间序列?
- javascript - 使用 FETCH 单击按钮提交表单并使用 PHPMailer 发送电子邮件
- xslt - XSLT 确定参数是 null 还是空然后做一些事情
- flutter - flutter 如何组合多个Map
; 在一个变量中 - javascript - 使用 java 脚本和 html css 移动图像