Actuellement, j'ai une application Spring Boot utilisant Spring Data REST. J'ai une entité de domaine Post
qui a la @OneToMany
relation à une autre entité de domaine, Comment
. Ces classes sont structurées comme suit:
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...
}
Leurs référentiels Spring Data REST JPA sont des implémentations de base de CrudRepository
:
PostRepository.java:
public interface PostRepository extends CrudRepository<Post, Long> { }
CommentRepository.java:
public interface CommentRepository extends CrudRepository<Comment, Long> { }
Le point d'entrée de l'application est une application Spring Boot standard et simple. Tout est configuré en stock.
Application.java
@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
}
Tout semble fonctionner correctement. Lorsque j'exécute l'application, tout semble fonctionner correctement. Je peux POSTER un nouvel objet Post pour http://localhost:8080/posts
aimer ainsi:
Corps:
{"author":"testAuthor", "title":"test", "content":"hello world"}
Résultat à 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"
}
}
}
Cependant, lorsque j'effectue un GET à, http://localhost:8080/posts/1/comments
j'obtiens un objet vide {}
renvoyé, et si j'essaie de POSTER un commentaire sur le même URI, j'obtiens une méthode HTTP 405 non autorisée.
Quelle est la bonne façon de créer une Comment
ressource et de l'associer à celle-ci Post
? J'aimerais éviter de poster directement sur http://localhost:8080/comments
si possible.
Réponses:
Vous devez d'abord publier le commentaire et lors de la publication du commentaire, vous pouvez créer une entité de publication d'association.
Cela devrait ressembler à quelque chose comme ci-dessous:
et cela fonctionnera parfaitement bien.
la source
author.post
est accessible en écriture (par exemple en ayant un setter ou une@JsonValue
annotation)En supposant que vous ayez déjà découvert l'URI post et donc l'URI de la ressource d'association (considérée comme étant
$association_uri
dans ce qui suit), il effectue généralement ces étapes:Découvrez la ressource de collection gérant les commentaires:
Suivez le
comments
lien etPOST
vos données vers la ressource:Attribuez le commentaire au message en émettant un
PUT
à l'URI de l'association.Notez qu'à la dernière étape, selon la spécification de
text/uri-list
, vous pouvez soumettre plusieurs URI identifiant des commentaires séparés par un saut de ligne pour affecter plusieurs commentaires à la fois.Quelques notes supplémentaires sur les décisions générales de conception. Un exemple de publication / commentaire est généralement un excellent exemple d'agrégat, ce qui signifie que j'éviterais la référence arrière du
Comment
vers lePost
et que j'éviteraisCommentRepository
complètement le. Si les commentaires n'ont pas de cycle de vie par eux-mêmes (ce qu'ils n'ont généralement pas dans une relation de style composition), vous préférez obtenir les commentaires rendus directement en ligne et l'ensemble du processus d'ajout et de suppression de commentaires peut plutôt être traité en utilisant Patch JSON . Spring Data REST a ajouté la prise en charge de cela dans la dernière version candidate de la prochaine version 2.2.la source
@JoinColumn(nullable=false)
)? Il ne serait pas possible de POSTER d'abord l'enfant, puis de PUT / PATCH l'association parent.Il existe 2 types d'association et de composition de mappage. En cas d'association, nous avons utilisé le concept de table de jointure comme
Employé - 1 à n-> Département
Donc 3 tables seront créées dans le cas de l'Association Employé, Département, Employé_Département
Il vous suffit de créer le EmployeeRepository dans votre code. En dehors de cette cartographie devrait être comme ça:
Depatment Entity ne contiendra aucun mappage pour la clé forign ... alors maintenant, lorsque vous essaierez la demande POST pour ajouter un employé avec un service dans une seule demande json, elle sera ajoutée ....
la source
J'ai été confronté au même scénario et j'ai dû supprimer la classe de référentiel pour la sous-entité car j'ai utilisé un à plusieurs mappages et extraire des données via l'entité principale elle-même. Maintenant, j'obtiens toute la réponse avec des données.
la source
Pour le mappage oneToMany, créez simplement un POJO pour la classe que vous souhaitez mapper, et une annotation @OneToMany dessus, et en interne, il le mappera à cet identifiant de table.
En outre, vous devez implémenter l'interface Serializable à la classe que vous récupérez les données.
la source