#java #spring-boot #hibernate
#java #spring-boot #hibernate
Вопрос:
Мой вопрос может показаться глупым для некоторых людей, но я не могу указать Hibernate извлекать идентификатор вместо вставки новой записи. Моя проблема связана с методом POST весенней загрузки. Например, давайте представим, что у меня есть 3 таблицы: авторы, книги и типы книг.
Я отправляю JSON, подобный этому, для вставки моей новой книги (отношения настроены с CascasdeType.ALL
помощью) :
{
"book": {
"name": "my super book",
"author": [
{
"name": "Julian DESD"
},
{
"name": "Maria GRATH"
}
],
"type" : {
"name": "Fantasy"
}
}
В моей таблице типов книг тип Fantasy уже существует. Я бы хотел, чтобы hibernate получал этот идентификатор вместо вставки новой «фантазийной» записи с новым идентификатором (что вызывает ошибки из-за ограничений уникальности).
Book.java
public class Book implements Serializable {
// Other fields
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "BookType_idBookType")
private BookType type;
}
BookController.java
@PostMapping("/add")
public ResponseEntity<Void> addBook(@RequestBody Book book) {
Book book1 = bookService.save(book);
URI location = ServletUriComponentsBuilder
.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(book1.getId())
.toUri();
return ResponseEntity.created(location).build();
}
Вероятно, мне не хватает аннотации. Пожалуйста, помогите мне.
Комментарии:
1. Вам нужно будет найти этот уже существующий тип. Я не думаю, что вы можете позволить этому делать автоматически
2. Да, но, как вы можете видеть, я не управляю созданием типа книги. Я просто сохраняю книгу
3. Что именно
BookType
? другая таблица? Тогда как вы конвертируете из aString
в JSON вBookType
в вашей сущности?4. BookType — это сущность. Да, извините, это был пример, который я плохо скопировал. Я отредактировал JSON.
Ответ №1:
Он основан на первичном ключе, который вы определили в классе объектов hibernate. 1) Если стратегия генерации первичного ключа выполняется автоматически, вам нужно написать код для извлечения записи, а затем обновить записи 2) Если первичным ключом является name, он будет вставлять / обновлять записи в зависимости от доступности в базе данных
Комментарии:
1. Первичный ключ — это идентификатор с автоматической стратегией, и я не хочу обновлять записи, это не имеет смысла. Какие-либо ресурсы для проверки записи кода записи выборки?