@GeneratedValue не извлекает значение из БД в новом сеансе - PullRequest
0 голосов
/ 02 мая 2018

Мое требование - заставить hibernate извлекать последнее значение для PI, уже доступного в существующей таблице, и добавлять новую запись, увеличивая максимальное значение PI на единицу.

Ниже приведена моя реализация класса Entity

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;

    private String name;
}

Ниже мой класс, через который я ввожу значение в User таблицу

@PostMapping("/jpa/users")
public void addUser(@Valid @RequestBody User user)
{
    User saved = userRepository.save(user);
}    

В моей пользовательской таблице уже есть значения ниже, чем я запускаю приложение

id  name
1   sample_name_1
2   sample_name_2

Теперь, когда я запускаю свое приложение и пытаюсь вставить новое значение в таблицу User, оно должно ввести новую запись с PI как 3

Пример: Ниже приведено тело запроса JSON (Входные данные)

{
    "name": "sample_name_3"
}

выдает приведенную ниже ошибку

{
"timestamp": "2018-05-01T23:09:31.806+0000",
"status": 500,
"error": "Internal Server Error",
"message": "could not execute statement; SQL [n/a]; constraint [\"PRIMARY KEY ON PUBLIC.USER(ID)\"; SQL statement:\ninsert into user (name, id) values (?, ?) [23505-197]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
"path": "/jpa/users"
}

Я понимаю, что возникла ошибка противопоказаний PrimaryIndex. Он пытается вставить новую запись с PI как 1

Если моя таблица user пуста, и когда я вставляю пару записей, она добавляет новые автоматически увеличиваемые значения. Итак, я думаю, что Hibernate не читает последнее значение столбца id из таблицы user.

Какую аннотацию я должен использовать, чтобы hibernate считывал последнее значение id каждый раз перед вставкой новой записи.

PS: я уже опробовал нижеприведенную стратегию, и ничего из этого не работает

GenerationType.TABLE
GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.IDENTITY

1 Ответ

0 голосов
/ 02 мая 2018

Тип генерации, который вы хотите использовать, - GenerationType.IDENTITY, однако вам нужно

  1. использовать базу данных, которая поддерживает столбцы идентификаторов, а
  2. правильно определите столбец первичного ключа как столбец идентификаторов.

Так, например, в PostgreSQL вы должны определить свой столбец первичного ключа следующим образом:

CREATE TABLE mytable (
  id serial primary key,
  ...

Подробная информация об этом доступна в спецификации JPA в разделе 11.1.20 GeneratedValue Annotation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...