在Spring Data REST中发布@OneToMany子资源关联

目前我有一个使用Spring Data REST的Spring Boot应用程序。 我有一个域名实体Post@OneToMany关系到另一个域名实体, Comment 。 这些类的结构如下:

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

他们的Spring Data REST JPA存储库是CrudRepository基本实现:

PostRepository.java:

 public interface PostRepository extends CrudRepository<Post, Long> { } 

CommentRepository.java:

 public interface CommentRepository extends CrudRepository<Comment, Long> { } 

应用程序入口点是一个标准的,简单的Spring Boot应用程序。 一切都是configuration股票。

Application.java

 @Configuration @EnableJpaRepositories @Import(RepositoryRestMvcConfiguration.class) @EnableAutoConfiguration public class Application { public static void main(final String[] args) { SpringApplication.run(Application.class, args); } } 

一切似乎正常工作。 当我运行应用程序时,一切似乎正常工作。 我可以发布一个新的Post对象到http://localhost:8080/posts像这样:

{"author":"testAuthor", "title":"test", "content":"hello world"}{"author":"testAuthor", "title":"test", "content":"hello world"}

结果在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" } } } 

但是,当我在http://localhost:8080/posts/1/comments执行GET时,我得到一个空对象{} ,并且如果我尝试向相同的URI发布注释,我得到一个HTTP 405方法不是允许。

创buildComment资源的正确方法是什么? 如果可能的话,我想避免直接发送到http://localhost:8080/comments

您必须首先发布评论,发布评论时可以创build关联post实体。

它应该如下所示:

 http://{server:port}/comment METHOD:POST {"author":"abc","content":"PQROHSFHFSHOFSHOSF", "post":"http://{server:port}/post/1"} 

它会工作得很好。

假设您已经发现了发布URI并因此发现了关联资源的URI(在下文中被认为是$association_uri ),它通常会采取以下步骤:

  1. 发现收集资源pipe理评论:

     curl -X GET http://localhost:8080 200 OK { _links : { comments : { href : "…" }, posts : { href : "…" } } } 
  2. 按照comments链接并将您的数据发布到资源:

     curl -X POST -H "Content-Type: application/json" $url { … // your payload // … } 201 Created Location: $comment_url 
  3. 通过向关联URI发布PUT来为post分配评论。

     curl -X PUT -H "Content-Type: text/uri-list" $association_url $comment_url 204 No Content 

请注意,在最后一步,根据text/uri-list的规范,您可以提交多个标识由换行符分隔的注释的URI,以一次分配多个注释。

关于一般devise决定的更多注意事项。 post/评论的例子通常是一个很好的例子,这意味着我会避免从CommentPost的反向引用,也完全避免CommentRepository 。 如果评论本身没有生命周期(他们通常不会使用构图风格的关系),而是直接使用内联方式呈现评论,而添加和删除评论的整个过程则可以通过使用JSON补丁 。 Spring Data REST在即将到来的2.2版本的最新候选版本中增加了对此的支持 。

我面临同样的情况,我不得不删除存储库类的子实体,因为我已经使用一对多的映射和通过主实体本身拉数据。 现在我得到了整个数据的答复。

映射关联和组合有两种types。 在关联的情况下,我们使用连接表的概念

员工 – 1到n->部门

因此,如果关联员工,部门,员工部门将创build3个表

你只需要在你的代码中创buildEmployeeRepository。 除此之外,映射应该是这样的:

 class EmployeeEntity{ @OnetoMany(CascadeType.ALL) private List<Department> depts { } } 

Depatment Entity将不包含forign key的任何映射…所以现在当你尝试POST请求在单个json请求中添加Department的Employee时,它将被添加….