Mapping von JSON-Objekt zu Hibernate entity
Beginne ich ein Projekt von einer REST-Anwendung verwaltet werden, die mit Spring und Hibernate für mein Modell.
Weiß ich, dass der Frühling ermöglicht es Ihnen, Java-Objekt aus dem HTTP-Request (mit @Consumes(JSON)
annotation). Gibt es einen Konflikt, wenn diese Java-Objekt ist auch ein Hibernate-Entitäten? Und verschachtelte Objekt arbeiten (wie @ManyToOne
Bezug)?
InformationsquelleAutor Fractaliste | 2014-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wurden wir mit solchen Ansatz zur Vereinfachung der Konstruktion und loszuwerden, viele dtos (wir waren zu missbrauchen, Ihnen zu viel). Im Grunde ist es für uns gearbeitet.
Jedoch in unserem REST-Modell haben wir versucht, setzen Sie nicht andere Beziehungen für ein Objekt, wie Sie können, erstellen Sie immer eine andere Ressourcen, um Ihnen den Zugang.
Also wir setzen einfach
@JsonIgnore
Anmerkungen zu den Beziehungen Zuordnungen wie@OneToMany
oder@ManyToOne
macht Sie vorübergehend.Weiteres problem sehe ich, dass, wenn Sie immer noch gerne zurück, diese Beziehungen, die Sie verwenden würde
Join.FETCH
Strategie für Sie oder verschieben Sie das Transaktionsmanagement höher, so dass die Transaktion noch existiert, wenn eine Antwort zu JSON serialisiert (Open Session In View Pattern).Meiner Meinung nach sind diese beiden Lösungen nicht so gut.
@JsonIgnore
Anmerkung, aber ich muss noch durch die beiden verschiedenen Objekte, bekomme ich zwei Parameter aus HTTP-Anfrage ? (wie eine Methode der Art:public void createPeople(@RequestBody AnEntity entityOne, AnOtherEntity entityTwo) {...}
)Soweit ich weiß, können Sie map-request-body nur auf ein Objekt. Also ich bin mir nicht ganz sicher, dass dies möglich ist. Beachten Sie jedoch, dass, wenn notwendig, die Sie verwenden können
@JsonIgnore
nur für Serialisierung/Deserialisierung indem es auf getter/setter-bzw. Auch ich glaube immer noch, dass die Erstellung von Objekt und relation in einer Anfrage ist nicht so Erholsam. Ich würde einen anderen REST-Endpunkt für das speichern von Objekt-Verhältnis und verwenden Sie es.InformationsquelleAutor oceansize
Als ich erklärte, in dieser Artikel, es ist sehr einfach zu bestehen JSON-Objekt mit Hibernate.
Schrieb ich einen Artikel darüber, wie Sie anzeigen von JSON-Objekten auf beiden PostgreSQL und MySQL.
Für PostgreSQL, müssen Sie senden das JSON-Objekt in eine binäre form:
Den
JsonBinarySqlTypeDescriptor
sieht wie folgt aus:und die
JsonTypeDescriptor
wie diese:Nun müssen Sie erklären die neue Art entweder auf der Klasse oder in einer package-info.java Paket-Ebene descriptior:
Und die entity mapping wird wie folgt Aussehen:
Das ist es!
Location
, ist es möglich, generische JSON-Objekt? Zum Beispiel@Type(type = "jsonb") @Column(columnDefinition = "json") private JSONObject document;
Sicher. Das ist sogar noch einfacher. Sie können sich dieses Beispiel zum speichern/abrufen JsonNode statt.
Vielen Dank, es hat geklappt
InformationsquelleAutor Vlad Mihalcea
Ja, das wäre kein problem und ist eigentlich eine ziemlich gängige Praxis.
In den letzten Jahren habe ich bemerkt, dass das manchmal, aber es ist nicht eine gute Idee, immer bauen Sie Ihre Ansichten basierend auf Ihrer domain direkt. Sie können einen Blick auf diesen Beitrag:
http://codebetter.com/jpboodhoo/2007/09/27/screen-bound-dto-s/
Es ist auch bekannt als "Presentation Model":
http://martinfowler.com/eaaDev/PresentationModel.html
Die Idee dahinter ist im Grunde die folgende:
Stellen Sie sich vor Sie haben den domain-Eintrag User, die so aussieht :
Lassen Sie uns nun vorstellen, haben Sie einen Blick auf, wo Sie wollen-display, das den Namen des Nutzers, und Sie völlig kümmern sich nicht um die Berechtigungen. Wenn Sie Ihr Ansatz, die sofort die Rückkehr des Benutzers zu der Ansicht, Hibernate wird eine zusätzliche Verknüpfung aus der Berechtigungen-Tabelle, weil Ereignis, obwohl die Berechtigungen sind faul standardmäßig geladen, es gibt keine einfache Möglichkeit, das signal für die jackson serializer oder was auch immer Sie verwenden, Sie kümmern sich nicht über Sie in diesem bestimmten Anlass, so jackson wird versuchen, unproxy Sie (wenn Ihre Transaktion ist noch am Leben durch die Zeit, die Ihr Objekt für die json-Serialisierung, sonst erhalten Sie eine unangenehme Ausnahme). Ja, können Sie eine
@JsonIgnore
annotation auf die Berechtigungen Feld, aber dann, wenn Sie es brauchen in einigen anderen Sicht, Sie sind geschraubt.Dass ein sehr einfaches Beispiel, aber man sollte auf die Idee kommen, dass manchmal Ihre domain Modell kann nicht sofort verwendet werden, zurückgegeben werden, in der Präsentations-Schicht, aufgrund von code-Wartbarkeit und performance-Probleme.
InformationsquelleAutor Nikola Yovchev
Sie können die Karte der json-Anfrage ohne Verwendung einer Bibliothek zu REST-web-services (jersy legalisiert)
dieser Beispiel-code:
Diese hibernate-Entität namens Buch:
Diese web-services-Funktion
Diesem Beispiel wird json Anfrage:
}
InformationsquelleAutor hager
Da Sie gerade erst anfangen, könnten Sie vielleicht nutzen Spring Data REST?
Ist dies das Projekt: http://projects.spring.io/spring-data-rest/
Und hier sind einige einfache Beispiele:
Wie Sie sehen können, in den Beispielen gibt es keine extra DTOs über die @Entity annotierten POJOs.
InformationsquelleAutor Rajit