PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Các kiểu tùy chỉnh JPA (EclipseLink) có khả thi không?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tắt cảnh báo trong sqlalchemy

  2. Có cách nào để xác định một hằng số được đặt tên trong một truy vấn PostgreSQL không?

  3. Runtime.getRuntime (). Thực thi để truyền tham số khi được nhắc

  4. Spring Data Rest:Truy vấn ngày là null ném một ngoại lệ postgres

  5. SQLalchemy không thực hiện các thay đổi khi thiết lập vai trò