Я не думаю, что принятый ответ правильный. Смотри https://coderanch.com/t/628230/framework/Spring-Data-obtain-id-added
tldr;
Вам просто нужно создать репозиторий для дочернего элемента B
, чтобы вы могли полностью сохранить дочерний элемент независимо от его родительского элемента. Как только у вас есть сохраненный файл B entity
, свяжите его с его родителем A
.
Вот пример кода: Todo
является родителем, а Comment
- дочерним.
@Entity
public class Todo {
@OneToMany(mappedBy = "todo", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<Comment> comments = new HashSet<>();
// getters/setters omitted.
}
@Entity
public class Comment {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "todo_id")
private Todo todo;
// getters/setters omitted.
}
Если это было смоделировано в весенних данных, вы создаете 2 хранилища. TodoRepository
и CommentRepository
, которые Autowired
in.
Учитывая конечную точку отдыха, способную получить POST /api/todos/1/comments
, чтобы связать новый комментарий с данным идентификатором todo.
@PostMapping(value = "/api/todos/{todoId}/comments")
public ResponseEntity<Resource<Comment>> comments(@PathVariable("todoId") Long todoId,
@RequestBody Comment comment) {
Todo todo = todoRepository.findOne(todoId);
// SAVE the comment first so its filled with the id from the DB.
Comment savedComment = commentRepository.save(comment);
// Associate the saved comment to the parent Todo.
todo.addComment(savedComment);
// Will update the comment with todo id FK.
todoRepository.save(todo);
// return payload...
}
Если вместо этого вы сделали ниже и сохранили предоставленный параметр comment
. Единственный способ получить новый комментарий - это перебрать todo.getComments()
и найти предоставленный comment
, что раздражает и нецелесообразно, если коллекция является Set
.
@PostMapping(value = "/api/todos/{todoId}/comments")
public ResponseEntity<Resource<Comment>> comments(@PathVariable("todoId") Long todoId,
@RequestBody Comment comment) {
Todo todo = todoRepository.findOne(todoId);
// Associate the supplied comment to the parent Todo.
todo.addComment(comment);
// Save the todo which will cascade the save into the child
// Comment table providing cascade on the parent is set
// to persist or all etc.
Todo savedTodo = todoRepository.save(todo);
// You cant do comment.getId
// Hibernate creates a copy of comment and persists it or something.
// The only way to get the new id is iterate through
// todo.getComments() and find the matching comment which is
// impractical especially if the collection is a set.
// return payload...
}