Ответ 1
Прогуливаясь по SO, я нашел много вопросов, подобных этому в JSON или типах XML для отображения в Postgres. Похоже, что никто не столкнулся с проблемой чтения из пользовательского типа Postgres, поэтому здесь решение для чтения и записи использует механизм преобразования типа JPA.
Драйвер Postgres JDBC отображает все атрибуты для неизвестных (для Java) типов в объект org.postgresql.util.PGobject, поэтому достаточно сделать конвертер для этого типа. Вот пример сущности:
@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
}
Вот пример конвертера:
@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;
}
}
}
Если вам действительно нужно придерживаться представления String JSON в вашей сущности, вы можете сделать такой конвертер для типа String
implements AttributeConverter<String, PGobject>
Здесь очень грязное (хотя и работающее) доказательство концепции, оно также использует сериализацию поддельных объектов, чтобы сообщить JPA, что объект был изменен, если он был