Spring Data REST中的资源关联

目前我有一个使用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应用程序。 一切都是配置股票。

Application.java

@Configuration
@EnableJpaRepositories
@Import(RepositoryRestMvcConfiguration.class)
@EnableAutoConfiguration
public class Application {

    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

一切似乎正常工作。 当我运行应用程序时,一切似乎都正常工作。 我可以像这样POST一个新的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方法不是允许。

创建Comment资源并将其与该Post相关联的正确方法是什么? 如果可能,我想避免直接发送到http://localhost:8080/comments


您必须首先发布评论,发布评论时可以创建关联帖子实体。

它应该如下所示:

http://{server:port}/comment METHOD:POST

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

它会工作得很好。


假设您已经发现了发布URI并因此发现了关联资源的URI(在下面被认为是$association_uri ),它通常需要执行以下步骤:

  • 发现收集资源管理评论:

    curl -X GET http://localhost:8080
    
    200 OK
    { _links : {
        comments : { href : "…" },
        posts :  { href : "…" }
      }
    }
    
  • 按照comments链接, POST数据到资源:

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

    curl -X PUT -H "Content-Type: text/uri-list" $association_url
    $comment_url
    
    204 No Content
    
  • 请注意,在最后一步中,根据text/uri-list的规范,您可以提交多个识别由换行符分隔的注释的URI,以一次分配多个注释。

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


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

    员工 - 1到n->部门

    因此,如果关联员工,部门,员工部门将创建3个表格

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

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

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

    链接地址: http://www.djcxy.com/p/89595.html

    上一篇: resource association in Spring Data REST

    下一篇: Spring, JPA, Hibernate 3 vs 4