PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Възможни ли са потребителски типове JPA (EclipseLink)?

Разхождайки се през SO, намерих много въпроси като този относно JSON или XML типове за картографиране в Postgres. Изглежда, че никой не се е сблъсквал с проблема с четенето от потребителски тип Postgres, така че ето решението както за четене, така и за писане, използвайки чист механизъм за преобразуване на JPA тип.

JDBC драйверът на Postgres картографира всички атрибути за неизвестни (на 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, че обектът е променен, ако е бил

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. извършване на промяна за функциониране в R пакет и инсталиране на Ubuntu

  2. Прехвърляне на тип данни на Postgres

  3. Посочете часова зона, която да използвате като референтна часова зона

  4. Има ли безопасен начин за модифициране на таблицата pg_constraint, така че да не се извършва повече проверка (временно)?

  5. PostgreSQL - Писане на динамичен sql в съхранена процедура, която връща набор от резултати