一尘不染

是否存在将PostgreSQL hstore转换为JPA 2.1 DataType的优雅且通用的方法?

hibernate

我已经使用JPA 2.1 Converter将PostgreSQL转换hstoreMap<String, String>。但是我没有找到针对EclipseLink和Hibernate等不同JPA提供程序的通用方法。因此,我需要为每个JPA提供程序编写不同的Converter。

以下是为EclipseLink和Hibernate使用不同转换器的示例。 https://github.com/phstudy/jpa-
converter-sample

不同的JPA提供者是否有通用的方法?


阅读 235

收藏
2020-06-20

共1个答案

一尘不染

PostgreSQL
JDBC驱动程序提供了org.postgresql.util.HStoreConverter具有to
/ from Stringbyte[]转换功能的实用程序类。您可以使用它来实现自己的JPA 2.1
Converter

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.Map;
import org.postgresql.util.HStoreConverter;

@Converter
public class MyHStoreConverter 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实体中的JPA
注释一起使用:

@Entity
public class MyEntity {
    @Convert(converter = MyHStoreConverter.class)
    private Map<String, String> hstoreAttribute;
}

这是仅使用JPA标准的实现,因此应与JPA提供者无关。但是,较早之前,Hibernate错误HHH-8804阻止了使用Converter映射到泛型,但是Hibernate
5.0.0和4.3.11中已解决了该问题。Map<>

2020-06-20