Проблемы с @GeneratedValue в базе данных H2 - PullRequest
0 голосов
/ 20 марта 2020

Здравствуйте, сообщество StackOverflow, у меня проблема с аннотацией @GenerateValue. Я хочу, чтобы JPA генерировал значения для моего столбца ID. Но у меня есть еще одна колонка, в которой люди могут писать какие-то задачи (список задач).

Мой код выглядит так:

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;

, и у меня есть файл данных SQL, который записывает некоторые данные в начале в моей базе данных h2:

    INSERT INTO task VALUES(1, 'go to the gym');
    INSERT INTO task VALUES(2, 'eat with tom');
    INSERT INTO task VALUES(3, 'meetup');
    INSERT INTO task VALUES(4, 'doing some homeworks');
    INSERT INTO task VALUES(5, 'doing some exercise');
    INSERT INTO task VALUES(6, 'studying with Mat');

моя проблема в том, что когда я удаляю целочисленные значения из моего SQL файла данных, мой компилятор всегда говорит, что я должен объявить идентификатор для задач, но я думал, что @GenerateValue автоматически генерирует идентификаторы для меня?

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Вы должны использовать @GeneratedValue(strategy = GenerationType.IDENTITY) или @GeneratedValue(strategy = GenerationType.SEQUENCE) и убедиться, что у вас есть индекс или последовательность на уровне базы данных. Также при использовании автоматически сгенерированных идентификаторов не указывайте их явно при вставке.

Правильно:

INSERT INTO task(description) VALUES('go to the gym');

, но я подумал, что @GenerateValue автоматически генерирует идентификаторы для я?

Это неверное предположение, Hibernate просто использует идентификаторы, предоставленные БД. Чтобы заставить его работать, вам нужно создать индекс / последовательность для столбца первичного ключа.

1 голос
/ 20 марта 2020

Вы перепутали sql и впали в спящий режим. @GeneratedValue объявлено в вашем коде java, поэтому hibernate знает, что когда вы сохраняете сущность без идентификатора, она должна быть сгенерирована с помощью strategy.

С другой стороны, вы попытался сделать вставки, используя sql без передачи первичного ключа, так что вы прямо сказали, что это должно быть NULL, что явно противоречит ограничению.

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