PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Apakah tipe kustom JPA (EclipseLink) mungkin?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Alur kerja Symfony2 + Netbeans jarak jauh (feat. git)

  2. Bagaimana cara menambahkan kunci utama peningkatan otomatis ke tabel yang ada, di PostgreSQL?

  3. Lancar NHibernate dan PostgreSQL, SchemaMetadataUpdater.QuoteTableAndColumns - System.NotSupportedException:Metode yang ditentukan tidak didukung

  4. Cara mengekstrak jam dari kueri di postgres

  5. Apa cara yang benar untuk menggunakan perbedaan pada (Postgres) dengan SqlAlchemy?