В настоящее время у меня есть приложение Spring Boot, использующее Spring Data REST. У меня есть объект домена, 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...
}
Комментарий.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"}
Результат на 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 в, http://localhost:8080/posts/1/comments
я получаю пустой объект {}
, и если я пытаюсь отправить комментарий к тому же URI, я получаю HTTP 405 Method Not Allowed.
Как правильно создать Comment
ресурс и связать его с ним Post
? Я бы хотел, http://localhost:8080/comments
если возможно, избежать POSTing напрямую .
Ответы:
Вы должны сначала опубликовать комментарий, а при публикации комментария вы можете создать объект связи сообщений.
Это должно выглядеть примерно так:
и он будет работать отлично.
источник
author.post
это доступно для записи (например, с помощью установщика или@JsonValue
аннотации)Предполагая, что вы уже обнаружили URI сообщения и, следовательно, URI ресурса ассоциации (который рассматривается
$association_uri
ниже), обычно выполняются следующие шаги:Откройте для себя коллекцию ресурсов управления комментариями:
Перейдите по
comments
ссылке иPOST
своим данным на ресурс:Назначьте комментарий к публикации, выдав
PUT
URI ассоциации.Обратите внимание, что на последнем шаге, согласно спецификации
text/uri-list
, вы можете отправить несколько URI, идентифицирующих комментарии, разделенных разрывом строки, чтобы назначить несколько комментариев одновременно.Еще несколько замечаний по общим дизайнерским решениям. Пример сообщения / комментария обычно является отличным примером для агрегата, что означает, что я бы избегал обратной ссылки с
Comment
на,Post
а такжеCommentRepository
полностью избегал . Если комментарии не имеют собственного жизненного цикла (чего они обычно не имеют в отношении стиля композиции), вы скорее получите комментарии, отображаемые непосредственно в строке, и весь процесс добавления и удаления комментариев может быть решен с помощью Патч JSON . Spring Data REST добавил поддержку этого в последнем выпуске-кандидате для предстоящей версии 2.2.источник
@JoinColumn(nullable=false)
)? Было бы невозможно сначала выполнить POST дочернюю, а затем PUT / PATCH родительскую ассоциацию.Есть 2 типа сопоставления ассоциаций и композиции. В случае ассоциации мы использовали концепцию таблицы соединений, например
Сотрудник - с 1 по н-> Отдел
Таким образом, будут созданы 3 таблицы в случае Association Employee, Department, Employee_Department
Вам нужно только создать в своем коде EmployeeRepository. Помимо этого отображение должно быть таким:
Depatment Entity не будет содержать никакого сопоставления для иностранного ключа ... так что теперь, когда вы попробуете запрос POST для добавления сотрудника с отделом в один запрос json, он будет добавлен ....
источник
Я столкнулся с тем же сценарием, и мне пришлось удалить класс репозитория для подчиненной сущности, поскольку я использовал сопоставление один-ко-многим и извлекал данные через саму основную сущность. Теперь я получаю полный ответ с данными.
источник
Для сопоставления oneToMany просто создайте POJO для этого класса, который вы хотите сопоставить, и аннотацию @OneToMany к нему, и внутренне он сопоставит его с этим идентификатором таблицы.
Кроме того, вам необходимо реализовать интерфейс Serializable для класса, который вы получаете данные.
источник