Попытка сохранить новый (неуправляемый) объект с автоматически сгенерированным идентификатором приводит к ошибке - PullRequest
1 голос
/ 15 марта 2019

У меня есть класс MyEntity с несколькими столбцами, один из которых является идентификатором автоинкремента.MyEntity выглядит следующим образом:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(nullable = false)
private Long id;

Когда я создаю новый MyEntity и задаю все остальные столбцы (я не задаю столбец id), а затем вызываю persist:

MyEntity mn = new MyEntity("val1", "val2");
em.getTransaction().begin();
em.persist(mn);
em.getTransaction().commit();
em.close();

возникает следующая ошибка:

Запрос: DataModifyQuery (name = "SEQUENCE" sql = "ОБНОВЛЕНИЕ SEQUENCE SET SEQ_COUNT = SEQ_COUNT +? WHERE SEQ_NAME =?")

Причина: java.sql.SQLSyntaxErrorException: Таблица / Представление 'SEQUENCE' не существует.

Я пытался изменить стратегию @GeneratedValue безрезультатно.Есть много подобных проблем в сети, но нет четкого решения, что делать в этом случае.

Нужно ли присваивать определенное значение столбцу id в моей новой неуправляемой сущности?Нужно ли устанавливать конкретные значения в таблице, где находится столбец id (я только установил, что это первичный ключ)?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Использовать идентификатор для генерации идентификатора по БД:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Не добавляйте необязательно = false, nullable = false. Первичный ключ никогда не будет нулевым в RDBS.

0 голосов
/ 15 марта 2019

Какую базу данных вы используете?

https://docs.oracle.com/javaee/6/api/javax/persistence/GenerationType.html#AUTO утверждает, что поставщик сохраняемости выберет наиболее подходящее решение.

Если вы используете Hibernate, правильно ли вы указали диалект явно? Часто я видел, как Hibernate пытался угадать правильный диалект, но ошибся. Это может вызвать эффект домино, если стратегия AUTO выбрана неудачно.

...