sql >> Database >  >> RDS >> PostgreSQL

Zijn JPA (EclipseLink) aangepaste typen mogelijk?

Als ik door SO loop, heb ik veel van dit soort vragen gevonden met betrekking tot JSON- of XML-typen voor toewijzing in Postgres. Het lijkt erop dat niemand het probleem heeft gehad van het lezen van een aangepast Postgres-type, dus hier de oplossing voor zowel lezen als schrijven met behulp van een puur JPA-type conversiemechanisme.

Het Postgres JDBC-stuurprogramma wijst alle attributen voor onbekende (voor Java) typen toe aan het object org.postgresql.util.PGobject, dus het is voldoende om een ​​converter voor dit type te maken. Hier is een voorbeeld van een entiteit:

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

Hier het voorbeeld van de converter:

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

Als u zich echt aan String JSON-representatie in uw entiteit moet houden, kunt u een dergelijke converter maken voor String-type

implements AttributeConverter<String, PGobject>

Hier is een erg vies (hoewel werkend) proof of concept, het maakt ook gebruik van nep-objectserialisering om JPA te vertellen dat het object is gewijzigd als het was

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



  1. Verbijsterende Ruby/MySQL-fout:ongeldig pakket:volgnummer komt niet overeen

  2. SQLAlchemy with_for_update rijvergrendeling werkt niet?

  3. Zoek een string door alle tabellen in SQL Server te doorzoeken

  4. Toegang krijgen tot de laatst gemaakte rij in PHP/MySQL