【问题标题】:Springboot | JSONB Postgres | Exception: Unable to load class [jsonb]弹簧靴 | JSONB Postgres |异常:无法加载类 [jsonb]
【发布时间】:2019-05-25 08:50:59
【问题描述】:

我在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 设置。上述错误的帖子创建即将到来。

请让我知道可能的原因,提前谢谢:)

【问题讨论】:

  • 你找到解决办法了吗?
  • 不是确切的解决方案,但我现在能够继续的方式是将“私人列表替代位置”更改为“私人 JsonNode 替代位置”,没有时间深入挖掘更好的解决方案,这很好用,但会缺少对象类型检查
  • 我打算用JDBC,用Hibernate比什么都麻烦。它确实没有节省开发时间。 Hibernate 的性能也较差

标签: java postgresql spring-boot jsonb


【解决方案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>();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多