Springboot | JSONB Postgres |例外:无法加载类[jsonb]

时间:2018-12-27 10:00:15

标签: java postgresql spring-boot jsonb

我在springboot(2.1)+ postgres(10.5)+ hibernate(5.3.7)中使用jsonb。

以下是文件中的更改:

  1. 在pom.xml中

.... <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-52</artifactId> <version>2.3.5</version> </dependency> ....

  1. 实体定义:

```

@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设置。即将创建上述错误。

请让我知道可能的原因,在此先感谢:)

3 个答案:

答案 0 :(得分:1)

尝试以下

公共类ProjectPostgreSQL95Dialect扩展了PostgreSQL95Dialect {

  ID Key
0  A   X
1  A   X
3  B   Y
4  B   Z

}

在application.properties文件中替换如下。

hibernate.dialect = org.hibernate.dialect.PostgreSQL95Dialect

替换

hibernate.dialect = com.ashok.config.PostgreSQL95Dialect

答案 1 :(得分:0)

我使用的是最新版本的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 :(得分:0)

我会推荐的是:

创建一个在您的方言中注册该数据类型的类

// 记住我假设您使用的是 Postgres DB。替换

<块引用>

扩展PostgreSQL94方言

用你数据库的方言。

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>();
}