Dạo qua SO, tôi đã tìm thấy nhiều câu hỏi như thế này liên quan đến các loại JSON hoặc XML để ánh xạ vào Postgres. Có vẻ như chưa ai phải đối mặt với vấn đề đọc từ kiểu Postgres tùy chỉnh, vì vậy đây là giải pháp cho cả việc đọc và ghi bằng cách sử dụng cơ chế chuyển đổi kiểu JPA thuần túy.
Trình điều khiển Postgres JDBC ánh xạ tất cả các thuộc tính cho các loại không xác định (sang Java) thành đối tượng org.postgresql.util.PGobject, vì vậy nó đủ để tạo trình chuyển đổi cho loại này. Đây là ví dụ về thực thể:
@Entity
public class Course extends AbstractEntity {
@Column(name = "course_mapped", columnDefinition = "json")
@Convert(converter = CourseMappedConverter.class)
private CourseMapped courseMapped; // have no idea why would you use String json instead of the object to map
// getters and setters
}
Đây là ví dụ về bộ chuyển đổi:
@Converter
public class CourseMappedConverter implements AttributeConverter<CourseMapped, PGobject> {
@Override
public PGobject convertToDatabaseColumn(CourseMapped courseMapped) {
try {
PGobject po = new PGobject();
// here we tell Postgres to use JSON as type to treat our json
po.setType("json");
// this is Jackson already added as dependency to project, it could be any JSON marshaller
po.setValue((new ObjectMapper()).writeValueAsString(courseMapped));
return po;
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
public CourseMapped convertToEntityAttribute(PGobject po) {
try {
return (new ObjectMapper()).readValue(po.getValue(),CourseMapped.class);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
Nếu bạn thực sự cần phải biểu diễn chuỗi JSON trong thực thể của mình, bạn có thể tạo trình chuyển đổi như thế này cho loại Chuỗi
implements AttributeConverter<String, PGobject>
Đây là bằng chứng khái niệm rất bẩn (mặc dù đang hoạt động), nó cũng sử dụng tuần tự hóa đối tượng giả để nói với JPA rằng đối tượng đã bị thay đổi nếu nó là
https://github.com/sasa7812/psql-cache-evict-POC