【问题标题】:How to persist Entity containing Hstore field using OpenJPA如何使用 OpenJPA 持久化包含 Hstore 字段的实体
【发布时间】:2019-06-26 13:56:22
【问题描述】:

使用 OpenJPA 实现(PostgreSQL):

我正在尝试保留一个包含 Hstore 字段的实体:

@Entity
@Table(name = "gfx_properties")
@NamedQuery(name = "GfxProperties.findAll", query = "SELECT g FROM GfxProperties g")
public class GfxProperties implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "id_gfx_properties")
    private Integer idGfxProperties;

    @Lob @Persistent @Column(name = "key_values")
    private String keyValues;

    public Map<String, String> getKeyValues() {
        return keyValues != null ? HStoreConverter.fromString(keyValues) : new HashMap<>();
    }

    public void setKeyValues(Map<String, String> keyValues) {
        try {
            if (keyValues == null) {
                this.keyValues = null;
            } else {
                this.keyValues = HStoreConverter.toString(keyValues);
            }
        } catch (Exception e) {
            // Ignore
        }
    }

    // other getters and setters
}

但这似乎不起作用,我有一个例外告诉我:列«key_values»是hstore类型,但表达式是oid类型。

请帮帮我

【问题讨论】:

  • 您必须使用 OpenJPA 还是使用 Hibernate 替代方案?
  • 很遗憾我必须使用 OpenJPA

标签: java postgresql jpa openjpa


【解决方案1】:

您可以创建转换器:

@Converter(autoApply = true)
public class MapToStringConveter implements AttributeConverter<Map<String, String>, String> {
    @Override
    public String convertToDatabaseColumn(Map<String, String> attribute) {
        return HStoreConverter.toString(attribute);
    }

    @Override
    public Map<String, String> convertToEntityAttribute(String dbData) {
        return HStoreConverter.fromString(dbData);
    }
}

然后在你的实体中使用它:

@Convert(converter = MapToStringConveter.class)
@Column(name = "key_values")
private String keyValues;

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 2012-11-14
    • 2011-12-22
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多