Derzeit habe ich eine Spring Boot-Anwendung, die Spring Data REST verwendet. Ich habe eine Domänenentität, Post
die die @OneToMany
Beziehung zu einer anderen Domänenentität hat Comment
. Diese Klassen sind wie folgt aufgebaut:
Post.java:
@Entity
public class Post {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
private String title;
@OneToMany
private List<Comment> comments;
// Standard getters and setters...
}
Comment.java:
@Entity
public class Comment {
@Id
@GeneratedValue
private long id;
private String author;
private String content;
@ManyToOne
private Post post;
// Standard getters and setters...
}
Ihre Spring Data REST JPA-Repositorys sind grundlegende Implementierungen von CrudRepository
:
PostRepository.java:
public interface PostRepository extends CrudRepository<Post, Long> { }
CommentRepository.java:
public interface CommentRepository extends CrudRepository<Comment, Long> { }
Der Anwendungseinstiegspunkt ist eine einfache Standard-Spring-Boot-Anwendung. Alles ist Lager konfiguriert.
Application.java
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
}
Alles scheint richtig zu funktionieren. Wenn ich die Anwendung ausführe, scheint alles korrekt zu funktionieren. Ich kann ein neues Post-Objekt http://localhost:8080/posts
POSTEN, um es so zu mögen:
Körper:
{"author":"testAuthor", "title":"test", "content":"hello world"}
Ergebnis bei http://localhost:8080/posts/1
:
{
"author": "testAuthor",
"content": "hello world",
"title": "test",
"_links": {
"self": {
"href": "http://localhost:8080/posts/1"
},
"comments": {
"href": "http://localhost:8080/posts/1/comments"
}
}
}
Wenn ich jedoch ein GET bei ausführe http://localhost:8080/posts/1/comments
, wird ein leeres Objekt {}
zurückgegeben, und wenn ich versuche, einen Kommentar an denselben URI zu senden, wird eine HTTP 405-Methode nicht zulässig angezeigt.
Wie kann eine Comment
Ressource richtig erstellt und damit verknüpft werden Post
? Ich möchte es vermeiden, http://localhost:8080/comments
wenn möglich direkt zu posten .
Antworten:
Sie müssen zuerst den Kommentar veröffentlichen, und während Sie den Kommentar veröffentlichen, können Sie eine Entitätsbeitragsentität erstellen.
Es sollte ungefähr so aussehen:
und es wird perfekt funktionieren.
quelle
author.post
@JsonValue
Angenommen, Sie haben den Post-URI und damit den URI der Zuordnungsressource bereits erkannt (wird
$association_uri
im Folgenden berücksichtigt), werden im Allgemeinen die folgenden Schritte ausgeführt:Entdecken Sie die Kommentare zur Verwaltung von Sammlungsressourcen:
Folgen Sie dem
comments
Link undPOST
Ihren Daten zur Ressource:Weisen Sie dem Beitrag den Kommentar zu, indem Sie
PUT
dem Assoziations-URI ein a ausgeben .Beachten Sie, dass Sie im letzten Schritt gemäß der Spezifikation von
text/uri-list
mehrere URIs senden können, die durch einen Zeilenumbruch getrennte Kommentare identifizieren, um mehrere Kommentare gleichzeitig zuzuweisen.Noch ein paar Anmerkungen zu den allgemeinen Entwurfsentscheidungen. Ein Post / Kommentar-Beispiel ist normalerweise ein großartiges Beispiel für ein Aggregat, was bedeutet, dass ich den Rückverweis von der
Comment
auf diePost
und auch dieCommentRepository
vollständige vermeiden würde . Wenn die Kommentare keinen eigenen Lebenszyklus haben (was normalerweise nicht in einer Beziehung im Kompositionsstil der Fall ist), werden die Kommentare eher direkt inline gerendert, und der gesamte Prozess des Hinzufügens und Entfernens von Kommentaren kann eher mithilfe von behandelt werden JSON-Patch . Spring Data REST hinzugefügt Unterstützung für die in der aktuellen Release Candidate für die kommende Version 2.2.quelle
@JoinColumn(nullable=false)
)? Es wäre nicht möglich, zuerst das untergeordnete Element und dann die übergeordnete Zuordnung zu setzen / zu patchen.Es gibt zwei Arten der Zuordnung von Zuordnung und Zusammensetzung. Im Falle einer Assoziation haben wir das Join-Tabellen-Konzept wie verwendet
Mitarbeiter - 1 bis n-> Abteilung
So werden 3 Tabellen für den Fall Association Employee, Department, Employee_Department erstellt
Sie müssen nur das EmployeeRepository in Ihrem Code erstellen. Abgesehen davon sollte das Mapping so sein:
Die Abteilungsentität enthält keine Zuordnung für den Ausgabeschlüssel. Wenn Sie also jetzt die POST-Anforderung zum Hinzufügen eines Mitarbeiters mit Abteilung in einer einzelnen JSON-Anforderung versuchen, wird sie hinzugefügt.
quelle
Ich hatte das gleiche Szenario und musste die Repository-Klasse für die Unterentität entfernen, da ich eine bis viele Zuordnungen verwendet und Daten durch die Hauptentität selbst gezogen habe. Jetzt bekomme ich die gesamte Antwort mit Daten.
quelle
Erstellen Sie für die oneToMany-Zuordnung einfach ein POJO für die Klasse, die Sie zuordnen möchten, und eine @ OneToMany-Annotation, und intern wird es dieser Tabellen-ID zugeordnet.
Außerdem müssen Sie die serialisierbare Schnittstelle für die Klasse implementieren, in der Sie die Daten abrufen.
quelle