在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
),它通常会采取以下步骤:
-
发现收集资源pipe理评论:
curl -X GET http://localhost:8080 200 OK { _links : { comments : { href : "…" }, posts : { href : "…" } } }
-
按照
comments
链接并将您的数据发布到资源:curl -X POST -H "Content-Type: application/json" $url { … // your payload // … } 201 Created Location: $comment_url
-
通过向关联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/评论的例子通常是一个很好的例子,这意味着我会避免从Comment
到Post
的反向引用,也完全避免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时,它将被添加….