弹簧靴 | 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]的主要内容,如果未能解决你的问题,请参考以下文章

带有弹簧靴的rabbitmq中的异常

弹簧靴在 Wildfly 8 上不起作用

弹簧靴暴露ID [重复]

弹簧靴服务角度

弹簧靴。 CORS。 'allowCredentials = false' 不起作用

带sitemesh的弹簧靴