Java 使用JPA将JSON存储到postgres中?

Java 使用JPA将JSON存储到postgres中?,java,postgresql,jpa,eclipselink,converters,Java,Postgresql,Jpa,Eclipselink,Converters,我正在尝试使用EclipseLink JPA实现将JSON字符串从AS持久化到postgresql中 为此,我在JPA中使用了javaxJsonObject,并编写了一个转换器来转换为PGObject JPA: import javax.json.JsonObject; @Entity @Table(name="\"CONTAINER\"") @NamedQuery(name="Container.findAll", query="SELECT r FROM Container r") pub

我正在尝试使用EclipseLink JPA实现将JSON字符串从AS持久化到postgresql中

为此,我在JPA中使用了javax
JsonObject
,并编写了一个转换器来转换为
PGObject

JPA:

import javax.json.JsonObject;

@Entity
@Table(name="\"CONTAINER\"")
@NamedQuery(name="Container.findAll", query="SELECT r FROM Container r")
public class Container implements ResourceJPA, Serializable {

    @Column(name="\"creationTime\"")
    private Timestamp creationTime;

    @Column(name="\"creator\"")
    private String creator;

    @Convert(converter=JsonConverter.class) 
    @Column(name="\"customAttribute\"", columnDefinition = "jsonb")
    private  JsonObject customAttribute;

...

}
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);
    }
  }
}
json转换器:

import javax.json.JsonObject;

@Entity
@Table(name="\"CONTAINER\"")
@NamedQuery(name="Container.findAll", query="SELECT r FROM Container r")
public class Container implements ResourceJPA, Serializable {

    @Column(name="\"creationTime\"")
    private Timestamp creationTime;

    @Column(name="\"creator\"")
    private String creator;

    @Convert(converter=JsonConverter.class) 
    @Column(name="\"customAttribute\"", columnDefinition = "jsonb")
    private  JsonObject customAttribute;

...

}
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);
    }
  }
}

有没有更好的方法将JSON存储到postgres
jsonb
字段中?

没有调用您的转换器。如果它确实被调用,它应该可以工作-您需要检查类路径以确保注释被拾取,或者如果某个警告或消息表明在持久化单元中加载的转换器有问题。@克里斯:我想你是对的,因为我在转换器的
convertToDatabaseColumn
中打印了,但从未打印过。然而,我尝试在
persistence.xml
中添加条目,但没有效果,也没有在持久性单元中加载的警告。我在检查中忽略了什么地方?检查持久化单元使用的类路径上没有这个类的过时实例。除此之外,没有线索-我通常尝试通过使用不存在的字段来打破类,以验证它是否使用了我认为应该使用的字段,然后从那里开始工作-注释不应该被忽略,因此,您可能必须打开finest日志,查看在部署持久化单元时是否有警告。@Chris问题在于eclipseLink jar。我刚刚升级了罐子,它工作得很好。谢谢你的支持!没有调用您的转换器。如果它确实被调用,它应该可以工作-您需要检查类路径以确保注释被拾取,或者如果某个警告或消息表明在持久化单元中加载的转换器有问题。@克里斯:我想你是对的,因为我在转换器的
convertToDatabaseColumn
中打印了,但从未打印过。然而,我尝试在
persistence.xml
中添加条目,但没有效果,也没有在持久性单元中加载的警告。我在检查中忽略了什么地方?检查持久化单元使用的类路径上没有这个类的过时实例。除此之外,没有线索-我通常尝试通过使用不存在的字段来打破类,以验证它是否使用了我认为应该使用的字段,然后从那里开始工作-注释不应该被忽略,因此,您可能必须打开finest日志,查看在部署持久化单元时是否有警告。@Chris问题在于eclipseLink jar。我刚刚升级了罐子,它工作得很好。谢谢你的支持!