PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy możliwe są niestandardowe typy JPA (EclipseLink)?

Przechodząc przez SO znalazłem wiele takich pytań dotyczących typów JSON lub XML do mapowania do Postgresa. Wygląda na to, że nikt nie spotkał się z problemem czytania z niestandardowego typu Postgres, więc tutaj rozwiązanie zarówno do czytania, jak i pisania przy użyciu czystego mechanizmu konwersji typu JPA.

Sterownik Postgres JDBC mapuje wszystkie atrybuty dla nieznanych (na Java) typów do obiektu org.postgresql.util.PGobject, więc wystarczy zrobić konwerter dla tego typu. Oto przykład encji:

@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
}

Oto przykład konwertera:

@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;
        }
    }
}

Jeśli naprawdę musisz trzymać się reprezentacji String JSON w swojej encji, możesz zrobić konwerter w ten sposób dla typu String

implements AttributeConverter<String, PGobject>

Tutaj jest bardzo brudny (choć działający) dowód koncepcji, wykorzystuje również fałszywą serializację obiektu, aby poinformować JPA, że obiekt został zmieniony, jeśli był

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. Jak nadać uprawnienia użytkownikowi we wszystkich nowych tabelach w Postgresie?

  2. Czy jest jakiś problem z instalacją psycopg2 w virtualenv na MacOS catalina z zainstalowanym PostgreSQL 12.1?

  3. ZAMÓW WEDŁUG listy wartości IN

  4. PHP/PostgreSQL:sprawdź, czy przygotowana instrukcja już istnieje

  5. Błąd niezdefiniowanej metody `to_key' dla [xxx] :Array podczas próby użycia danych tablicy w Active Admin table_for (Rails, Postgresql, postgres_ext gem)