Berjalan melalui SO saya telah menemukan banyak pertanyaan seperti ini mengenai tipe JSON atau XML untuk pemetaan ke Postgres. Sepertinya tidak ada yang menghadapi masalah membaca dari tipe Postgres khusus, jadi di sini solusi untuk membaca dan menulis menggunakan mekanisme konversi tipe JPA murni.
Driver JDBC Postgres memetakan semua atribut untuk tipe yang tidak dikenal (ke Java) ke dalam objek org.postgresql.util.PGobject, jadi cukup membuat konverter untuk tipe ini. Berikut adalah contoh entitas:
@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
}
Berikut contoh konverter:
@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;
}
}
}
Jika Anda benar-benar harus tetap menggunakan representasi String JSON di entitas Anda, Anda dapat membuat konverter seperti ini untuk tipe String
implements AttributeConverter<String, PGobject>
Ini adalah bukti konsep yang sangat kotor (meskipun berfungsi), ini juga menggunakan serialisasi objek palsu untuk memberi tahu JPA bahwa objek telah diubah jika itu
https://github.com/sasa7812/psql-cache-evict-POC