sql >> Databáze >  >> RDS >> PostgreSQL

Jsou možné vlastní typy JPA (EclipseLink)?

Při procházení SO jsem našel mnoho podobných otázek týkajících se typů JSON nebo XML pro mapování do Postgresu. Vypadá to, že nikdo nečelil problému čtení z vlastního typu Postgres, takže zde je řešení pro čtení i zápis pomocí čistého konverzního mechanismu typu JPA.

Postgres JDBC driver mapuje všechny atributy pro neznámé (do Javy) typy do objektu org.postgresql.util.PGobject, takže pro tento typ stačí udělat konvertor. Zde je příklad entity:

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

Zde je příklad převodníku:

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

Pokud se opravdu potřebujete držet reprezentace String JSON ve vaší entitě, můžete pro typ String vytvořit konvertor jako tento

implements AttributeConverter<String, PGobject>

Zde je velmi špinavý (ačkoli fungující) důkaz konceptu, který také používá falešnou serializaci objektů, aby řekl JPA, že objekt byl změněn, pokud ano

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



  1. Snížení spotřeby paměti mysql na mikro instanci [chráněné e-mailem]

  2. Všechny sloupce jsou nastaveny na stejnou hodnotu

  3. implementace UPDATE na SELECT v Postgresu

  4. Hibernate dialekt pro Oracle Database 11g?