将JsonNode对象映射到SQL DB JPA中的String字段

问题描述

我有一个带有这些字段的sql表:

id  uniqueidentifier primary key,<--Omitting extra fields -->
Metadata  nvarchar(max)

我也有一个映射到它的实体:

@Data
public class GenericEntity implements Serializable {

  @Id
  @GeneratedValue(generator = "uuid2")
  @GenericGenerator(name = "uuid2",strategy = "org.hibernate.id.UUIDGenerator")
  @Type(type = "uuid-char")
  private UUID id;
<--Omitting extra properties -->
  @Type(type = "string")
  private JsonNode Metadata;
}

作为JsonNode的第二个字段需要能够接受不同类型的json并将其作为字符串存储在表中。

如何转换JsonNode字段并将其作为String存储在数据库中,然后当我从表中读取时,它将String转换回JsonNode?​​ p>

有效载荷:

{
    "id": "db8e8d4b-eee2-4507-bf30-f55c3f948724",<-- Omitting extra properties -->
    "Metadata": {
        "description": "Sample","location": "Stack Overflow"
    }
}

现在,每次我尝试保存它时,我都会收到错误消息:

Could not determine type for: com.fasterxml.jackson.databind.JsonNode,at table: table_name,for columns: [org.hibernate.mapping.Column(Metadata)]

解决方法

我遵循以下指示: https://www.baeldung.com/hibernate-custom-types

创建了SqlTypeDescriptor

Request

然后我创建了一个Java类型描述符:

getCatalog(): Observable<CatalogItem[]> {
  return this.http.get<Workspace[]>(`${this.baseUrl}/workspace`).pipe(
    switchMap( (ws) => {
      return {
        workspace: ws,requests: this.http.get<Request[]>(`${this.baseUrl}/${ws.id}/requests`).subscribe();
      }
    })
  );
  //TODO: combine workspace and request create catalog obj
}

然后将类型定义添加到实体模型

public class JsonNodeStringType extends AbstractSingleColumnStandardBasicType<JsonNode> implements DiscriminatorType<JsonNode> {

  public static final JsonNodeStringType INSTANCE = new JsonNodeStringType();

  public JsonNodeStringType() {
    super(VarcharTypeDescriptor.INSTANCE,JsonNodeStringJavaDescriptor.INSTANCE);
  }

  @Override
  public String getName() {
    return "jsonnode";
  }

  @Override
  public JsonNode stringToObject(String xml) {
    return fromString(xml);
  }

  @Override
  public String objectToSQLString(JsonNode value,Dialect dialect) {
    return '\'' + toString(value) + '\'';
  }
}

如果您不想手动创建这些类型描述符,也可以按照本文使用外部依赖项:https://vladmihalcea.com/sql-server-json-hibernate/