弹簧靴 | JSONB Postgres |异常:无法加载类 [jsonb]
Posted
技术标签:
【中文标题】弹簧靴 | JSONB Postgres |异常:无法加载类 [jsonb]【英文标题】:Springboot | JSONB Postgres | Exception: Unable to load class [jsonb] 【发布时间】:2019-05-25 08:50:59 【问题描述】:我在springboot(2.1)+postgres(10.5)+hibernate(5.3.7)中使用jsonb。
以下是文件的变化:
-
在 pom.xml 中
....
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.3.5</version>
</dependency>
....
-
实体定义:
```
@Entity(name = "Event")
@Table(name = "event")
@TypeDefs(
@TypeDef(name = "string-array", typeClass = StringArrayType.class),
@TypeDef(name = "int-array", typeClass = IntArrayType.class),
@TypeDef(name = "json", typeClass = JsonStringType.class),
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class),
@TypeDef(name = "jsonb-node", typeClass = JsonNodeBinaryType.class),
@TypeDef(name = "json-node", typeClass = JsonNodeStringType.class),
)
public class Event
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private List<Location> alternativeLocations = new ArrayList<Location>();
//Getters and setters omitted for brevity
```
在运行 springboot 应用程序时出现以下错误:
nested exception is org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [jsonb]
所有其他设置都是使用 postgres 的标准 sprintboot 设置。上述错误的帖子创建即将到来。
请让我知道可能的原因,提前谢谢:)
【问题讨论】:
你找到解决办法了吗? 不是确切的解决方案,但我现在能够继续的方式是将“私人列表替代位置”更改为“私人 JsonNode 替代位置”,没有时间深入挖掘更好的解决方案,这很好用,但会缺少对象类型检查 我打算用JDBC,用Hibernate比什么都麻烦。它确实没有节省开发时间。 Hibernate 的性能也较差 【参考方案1】:我正在使用 hibernate-types-52 类的更新版本 2.4.3 并且遇到了同样的错误。
我通过仅使用我的实体类上需要的单个 typedef 来解决它。
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
Postgres 9.4、Java 11、Hibernate 5.3.7
@Entity(name = "audit")
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Audit
@Type(type = "jsonb")
@Column(name="audit_data", columnDefinition = "jsonb")
private Map<String,Object> auditData;
...
【讨论】:
【参考方案2】:试试下面的
公共类 ProjectPostgreSQL95Dialect 扩展了 PostgreSQL95Dialect
public ProjectPostgreSQL95Dialect()
this.registerColumnType(Types.JAVA_OBJECT, "jsonb");
在 application.properties 文件下面替换。
hibernate.dialect=org.hibernate.dialect.PostgreSQL95Dialect
替换
hibernate.dialect=com.ashok.config.PostgreSQL95Dialect
【讨论】:
应该是:hibernate.dialect=com.ashok.config.ProjectPostgreSQL95Dialect ? 还需要在将实现 jsonb 类型定义的每个实体之上添加 @TypeDefs(@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class))。否则休眠将不知道该实体正在实现它。【参考方案3】:我会推荐的是:
创建一个在您的方言中注册该数据类型的类
// 记住我假设您使用的是 Postgres DB。替换
扩展 PostgreSQL94Dialect
使用您的数据库方言。
public class MyPostgreSQL94Dialect extends PostgreSQL94Dialect
public MyPostgreSQL94Dialect()
this.registerColumnType(Types.JAVA_OBJECT, "jsonb");
接下来在你的 application.properties 中配置你应用的 spring.jpa.properties.hibernate.dialect
spring.jpa.properties.hibernate.dialect=java_path_to_this_class.MyPostgreSQL94Dialect
以上完成后 确保将使用方言中定义的 jsonb 的每个实体都在这些实体上声明,现在将理解类型定义
@Data
@TypeDefs(@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class))
public class Event implements Serializable
@Id
private String id;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private List<Location> alternativeLocations = new ArrayList<Location>();
【讨论】:
以上是关于弹簧靴 | JSONB Postgres |异常:无法加载类 [jsonb]的主要内容,如果未能解决你的问题,请参考以下文章