我在springboot(2.1)+ postgres(10.5)+ hibernate(5.3.7)中使用jsonb。
以下是文件中的更改:
....
<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设置。即将创建上述错误。
请让我知道可能的原因,在此先感谢:)
答案 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>();
}