web-dev-qa-db-ja.com

JPAでPostgres JSONBデータ型を使用する方法は?

JPA(EclipseLink)を使用してPostgreSQLからJSONおよびJSONBデータ型をマップする方法を見つけていません。このデータ型をJPAで使用している人はいますか?

17
justcode

すべての答えは、特にEclipseLinkやHibernateではなく、JPAに対応した最終的なソリューションに到達するのに役立ちました。

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import Java.io.IOException;
import javax.json.Json;
import javax.json.JsonObject;
import javax.persistence.Converter;
import org.postgresql.util.PGobject;

@Converter(autoApply = true)
public class JsonConverter implements javax.persistence.AttributeConverter<JsonObject, Object> {

  private static final long serialVersionUID = 1L;
  private static ObjectMapper mapper = new ObjectMapper();

  @Override
  public Object convertToDatabaseColumn(JsonObject objectValue) {
    try {
      PGobject out = new PGobject();
      out.setType("json");
      out.setValue(objectValue.toString());
      return out;
    } catch (Exception e) {
      throw new IllegalArgumentException("Unable to serialize to json field ", e);
    }
  }

  @Override
  public JsonObject convertToEntityAttribute(Object dataValue) {
    try {
      if (dataValue instanceof PGobject && ((PGobject) dataValue).getType().equals("json")) {
        return mapper.reader(new TypeReference<JsonObject>() {
        }).readValue(((PGobject) dataValue).getValue());
      }
      return Json.createObjectBuilder().build();
    } catch (IOException e) {
      throw new IllegalArgumentException("Unable to deserialize to json field ", e);
    }
  }
}
22
justcode

EclipseLinkのHibernateのUserTypeに類似していると思います。

http://www.Eclipse.org/eclipselink/documentation/2.6/jpa/extensions/annotations_ref.htm#CHDEHJEB

org.Eclipse.persistence.mappings.converters.Converterを実装し、変換を行うクラスを作成してから、そのタイプを使用しているすべてのフィールドで@Convertアノテーションを使用する必要があります。

2
coladict