Размещение @суб-ресурсов OneToMany ассоциации весной данные



в настоящее время у меня есть приложение Spring Boot с использованием Spring Data REST. У меня есть доменная сущность Post, которая имеет @OneToMany связь с другим доменным объектом,Comment. Эти классы структурированы следующим образом:



пост.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...
}


комментарий.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> { }


точка входа приложения-это стандартное, простое приложение для загрузки весной. Все настроено на складе.



приложение.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"}



результат 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"
}
}
}


однако, когда я выполняю GET at http://localhost:8080/posts/1/comments Я получаю пустой объект {} возвращено, и если я попытаюсь опубликовать комментарий к тому же URI, я получаю метод HTTP 405, который не разрешен.



Как правильно создать Comment ресурс и связать его с этим Post? Я хотел бы избежать публикации непосредственно в http://localhost:8080/comments если это возможно.

574   4  

4 ответов:

вы должны сначала опубликовать комментарий, и во время публикации комментария вы можете создать объект "сообщения Ассоциации".

Это должно выглядеть примерно так:

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

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

и он будет работать отлично.

предполагая, что вы уже обнаружили URI post и, следовательно, URI ресурса ассоциации (считается $association_uri в следующем), он обычно выполняет следующие действия:

  1. Откройте для себя управление ресурсами коллекции комментарии:

    curl -X GET http://localhost:8080
    
    200 OK
    { _links : {
        comments : { href : "…" },
        posts :  { href : "…" }
      }
    }
    
  2. следуя comments ссылке и POST ваши данные на ресурсе:

    curl -X POST -H "Content-Type: application/json" $url 
    { … // your payload // … }
    
    201 Created
    Location: $comment_url
    
  3. назначьте комментарий к сообщению, выдав PUT к ассоциация URI.

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

обратите внимание, что на последнем шаге, согласно спецификации text/uri-list, вы можете отправить несколько URI, идентифицирующих комментарии, разделенные разрывом строки, чтобы назначить несколько комментариев одновременно.

еще несколько замечаний по общим проектным решениям. Пример post / comments обычно является отличным примером для агрегата, что означает, что я бы избегал обратной ссылки из Comment до Post а также избежать элемент CommentRepository полностью. Если комментарии не имеют жизненного цикла сами по себе (что они обычно не делают в отношении стиля композиции), вы скорее получаете комментарии, отображаемые непосредственно в строке, и весь процесс добавления и удаления комментариев можно скорее решить с помощью JSON Patch. Весенний отдых данных добавил поддержку в последнем выпуске кандидата на предстоящую версию 2.2.

есть 2 типа сопоставления ассоциации и композиции. В случае ассоциации мы использовали концепцию join table как

сотрудник--от 1 до n - > отдел

Так что 3 таблицы будут созданы в случае Ассоциации Сотрудник, Отдел, Employee_Department

вам нужно только создать EmployeeRepository в коде. Кроме того, отображение должно быть таким:

class EmployeeEntity{

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

   }

}

Depatment Entity не будет содержать никаких отображений для forign key...so теперь, когда вы попробуете запрос POST для добавления сотрудника с отделом в один запрос json, он будет добавлен....

Я столкнулся с тем же сценарием, и мне пришлось удалить класс репозитория для суб-сущности, поскольку я использовал один для многих сопоставлений и вытаскивал данные через сам основной объект. Теперь я получаю весь ответ с данными.

Comments

    Ничего не найдено.