Sind JPA (EclipseLink) kundenspezifische Typen möglich?
Insbesondere bin ich daran interessiert, mit PostgreSQLs json
geben.
Den Kern des Problems scheint zu sein, dass es keine interne Zuordnung in Eclipselink zu json
geben. So, mit einem naiven Ansatz mit:
@Column(name = "json", columnDefinition = "json")
public String getJson() {
return json;
}
... und versuchen, ein Objekt einfügen, bekomme ich eine exception:
Internal Exception: org.postgresql.util.PSQLException: ERROR: column "json" is of type json but expression is of type character varying
Fair genug, nehme ich an.
Suche durch die EclipseLink docs, scheint es, dass die anwendbaren Anpassungen (Transformation Mappings, Native Queries-Wandler) verlassen sich auf die Daten bis zu der unterstützt-mappings (zahlen, Datumsangaben, strings etc) so macht es dies sehr umständlich zu umgehen, verwenden Hersteller spezielle Typen.
Den wichtigsten Grund, warum das so frustrierend ist, dass json
geben Sie in posgresql ausgedrückt ist die gleiche wie die text/varchar-und ich glaube (im moment, aber nicht für immer) ist nur ein alias von dieser Art - daher der Fahrer ist mehr als fähig, die übertragung dieser, es ist nur die Validierung Regeln, die in meinem Weg.
In Bezug auf die Lösung, die ich nicht Verstand zu verlieren Beweglichkeit (in Bezug auf die Allgemeine Datenbank-agnostisch und über herstellerspezifische Typen), sondern wollen einfach nur eine Lösung, die erlaubt mir, auf eine json
Typ als Attribut auf ein normales JPA Entity und behalten alle anderen Verhalten, die es gewohnt ist (schema generation, merge, persist, Transaktions-code
- Ja, gute Frage!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fuß durch, SO dass ich habe gefunden, dass viele Fragen wie diese über JSON oder XML-Typen für das mapping in Postgres. Es sieht aus wie niemand vor das problem der Lesung aus eigenen Postgres-Typ, also hier die Lösung zum Lesen und schreiben mit reinem JPA Typ-Konvertierung Mechanismus.
Postgres-JDBC-Treiber bildet alle Attribute für unbekannt (Java -) Arten in org.postgresql.util.PGobject Objekt, so ist es genug, um converter für diesen Typ. Hier ist entity Beispiel:
Hier der Wandler Beispiel:
Wenn Sie wirklich brauchen, um zu bleiben-String JSON-Darstellung in Ihrer Organisation, die Sie vornehmen können-Konverter, wie dies für String-Typ
Ist hier sehr schmutzig (wenn Sie arbeiten) proof-of-concept, es nutzt auch gefälschte Objekt-Serialisierung zu sagen, JPA, dass das Objekt geändert wurde, wenn es
https://github.com/sasa7812/psql-cache-evict-POC
PostgreSQL ist zu streng über die implizite Umwandlung zwischen text-wie Typen. Die einfachste Möglichkeit ist ein workaround durch anlegen einer Besetzung; siehe diese Antwort.
Den sauber Weg, es zu tun wäre, um erstellen Sie eine JPA-provider-Erweiterung, die nennt
setObject(my_json)
, und/oder lehren Sie Ihre JPA-provider explizit hinzufügenCAST('myvalue' AS json)
bei der Generierung von Abfragen. Dies ist ein Schmerz, denn es erfordert JPA-provider-spezifische Erweiterungen.Dieser Stack Overflow suchen finden Sie eine Reihe von Fragen für die
xml
Art, die Leute haben ähnliche Probleme mit.setObject
, welche Funktion / Methode ist, dass? setObject aus der PostgreSQL-jdbc-Treiber?