Размещение @суб-ресурсов 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 если это возможно.
4 ответов:
вы должны сначала опубликовать комментарий, и во время публикации комментария вы можете создать объект "сообщения Ассоциации".
Это должно выглядеть примерно так:
http://{server:port}/comment METHOD:POST {"author":"abc","content":"PQROHSFHFSHOFSHOSF", "post":"http://{server:port}/post/1"}и он будет работать отлично.
предполагая, что вы уже обнаружили URI post и, следовательно, 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назначьте комментарий к сообщению, выдав
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