我已经使用JPA 2.1 Converter将PostgreSQL转换hstore为Map<String, String>。但是我没有找到针对EclipseLink和Hibernate等不同JPA提供程序的通用方法。因此,我需要为每个JPA提供程序编写不同的Converter。
Converter
hstore
Map<String, String>
以下是为EclipseLink和Hibernate使用不同转换器的示例。 https://github.com/phstudy/jpa- converter-sample
不同的JPA提供者是否有通用的方法?
PostgreSQL JDBC驱动程序提供了org.postgresql.util.HStoreConverter具有to / from String和byte[]转换功能的实用程序类。您可以使用它来实现自己的JPA 2.1 Converter:
org.postgresql.util.HStoreConverter
String
byte[]
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 注释一起使用:
Convert
@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<>
Map<>