sql >> Database teknologi >  >> RDS >> PostgreSQL

Er JPA (EclipseLink) tilpassede typer mulige?

Ved at gå igennem SÅ har jeg fundet mange spørgsmål som dette angående JSON- eller XML-typer til kortlægning i Postgres. Det ser ud til, at ingen har stået over for problemet med at læse fra tilpasset Postgres-type, så her er løsningen til både læsning og skrivning ved hjælp af ren JPA-type konverteringsmekanisme.

Postgres JDBC driver kortlægger alle attributter for ukendte (til Java) typer til org.postgresql.util.PGobject objekt, så det er nok at lave konverter til denne type. Her er entitetseksempel:

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

Her er konvertereksemplet:

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

Hvis du virkelig har brug for at holde dig til String JSON-repræsentation i din enhed, kan du lave en konverter som denne til String type

implements AttributeConverter<String, PGobject>

Her er meget beskidt (selvom fungerende) proof of concept, det bruger også falsk objektserialisering til at fortælle JPA, at objektet blev ændret, hvis det var

https://github.com/sasa7812/psql-cache-evict-POC



  1. SQL Server 2017:Tilgængelige funktioner på Linux

  2. Brug en fagforening eller et medlem - hvad er hurtigere

  3. mysql-connector-java til mysql 5.6

  4. Indsæt lille ordbog som {1:23, 2:45, 3:17} i en kolonne af SQL-databasetabellen i Postgres ved hjælp af python-sprog