Как сообщить Hibernate о получении идентификатора вместо вставки новой записи

#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 ? другая таблица? Тогда как вы конвертируете из a String в JSON в BookType в вашей сущности?

4. BookType — это сущность. Да, извините, это был пример, который я плохо скопировал. Я отредактировал JSON.

Ответ №1:

Он основан на первичном ключе, который вы определили в классе объектов hibernate. 1) Если стратегия генерации первичного ключа выполняется автоматически, вам нужно написать код для извлечения записи, а затем обновить записи 2) Если первичным ключом является name, он будет вставлять / обновлять записи в зависимости от доступности в базе данных

Комментарии:

1. Первичный ключ — это идентификатор с автоматической стратегией, и я не хочу обновлять записи, это не имеет смысла. Какие-либо ресурсы для проверки записи кода записи выборки?