是否可以将hibernate与postgresql的jsonb数据类型一起使用?

yuvru6vn  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(523)

Hibernate5不支持postgresql jsonb 默认情况下为数据类型。
有什么办法可以实施吗 jsonb 支持hibernate+spring jpa?
如果有办法的话,使用它的利弊是什么 jsonb 和冬眠在一起?

oxosxuxt

oxosxuxt1#

感谢弗拉德·米哈尔恰,我们有这样的机会!)
他创建了hibernate类型库:

  1. <dependency>
  2. <groupId>com.vladmihalcea</groupId>
  3. <artifactId>hibernate-types-52</artifactId>
  4. <version>2.1.1</version>
  5. </dependency>

它为hibernate添加了对“json”、“jsonb”和其他类型的支持:

  1. @Data
  2. @NoArgsConstructor
  3. @Entity
  4. @Table(name = "parents")
  5. @TypeDefs({
  6. @TypeDef(name = "string-array", typeClass = StringArrayType.class),
  7. @TypeDef(name = "int-array", typeClass = IntArrayType.class),
  8. @TypeDef(name = "json", typeClass = JsonStringType.class),
  9. @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
  10. })
  11. public class Parent implements Serializable {
  12. @Id
  13. @GeneratedValue(strategy = SEQUENCE)
  14. private Integer id;
  15. @Column(length = 32, nullable = false)
  16. private String name;
  17. @Type(type = "jsonb")
  18. @Column(columnDefinition = "jsonb")
  19. private List<Child> children;
  20. @Type(type = "string-array")
  21. @Column(columnDefinition = "text[]")
  22. private String[] phones;
  23. public Parent(String name, List<Child> children, String... phones) {
  24. this.name = name;
  25. this.children = children;
  26. this.phones = phones;
  27. }
  28. }
  29. @Data
  30. @NoArgsConstructor
  31. @AllArgsConstructor
  32. public class Child implements Serializable {
  33. private String name;
  34. }

更多信息:1,2

展开查看全部
eqqqjvef

eqqqjvef2#

@cepr0-s的答案是正确的,但我有一些问题。我尝试将它与postgresql一起使用时遇到了一个异常 org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 . 在我的例子中,解决这个问题的方法是添加自定义的hibernate方言。此资源可能会有所帮助。

  1. // CustomPostgreSQLDialect.java
  2. public class CustomPostgreSQLDialect extends PostgreSQL10Dialect {
  3. public CustomPostgreSQLDialect() {
  4. super();
  5. registerHibernateType(Types.OTHER, StringArrayType.class.getName());
  6. registerHibernateType(Types.OTHER, IntArrayType.class.getName());
  7. registerHibernateType(Types.OTHER, JsonStringType.class.getName());
  8. registerHibernateType(Types.OTHER, JsonBinaryType.class.getName());
  9. registerHibernateType(Types.OTHER, JsonNodeBinaryType.class.getName());
  10. registerHibernateType(Types.OTHER, JsonNodeStringType.class.getName());
  11. }
  12. }
  1. # application.yml
  2. spring:
  3. jpa:
  4. properties:
  5. hibernate:
  6. dialect: "com.test.CustomPostgreSQLDialect"
展开查看全部

相关问题