Подтвердить что ты не робот

@GeneratedValue(strategy = GenerationType.AUTO) не работает как мысль

Я пытаюсь сохранить объект в базе данных. Продолжайте получать "Идентификатор столбца не может принимать ошибку с нулевым значением". Мой объект выглядит следующим образом:

    @Entity
public class TestTable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id = 0;

    @Column(nullable=false, length=256)
    private String data = "";

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

}

Моя функция persist:

public static synchronized boolean persistObject(Object obj){
        boolean success = true;
        EntityManager em = null;
        EntityTransaction tx = null;
        try{
            em = getEmf().createEntityManager();
            tx = em.getTransaction();
            tx.begin();
            em.persist(obj);
            tx.commit();

        } catch (Exception e){
            success = false;
        } finally{
            try{
                em.close();
            } catch(Exception e){
                //nothing
            }
        }
        return success;
    }
4b9b3361

Ответ 1

Вы можете использовать GenerationType.TABLE. Таким образом, jpa использует таблицу последовательностей для определения id, и вам, возможно, никогда не понадобится генерировать значения последовательности или автоматического увеличения или триггеры, которые уменьшают переносимость.

Также обратите внимание, что в java int type начинается с 0 по умолчанию, поэтому вы также можете избавиться от этого.

Ответ 2

В моем случае речь шла о плохом диалекте:

hibernate.dialect=org.hibernate.dialect.H2Dialect

вместо:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

когда я переключился на производственную базу данных. Hibernate попытался использовать стратегию, подготовленную для разных двигателей db.

Ответ 3

У меня была проблема с похожим проявлением к твоему. В конце концов я обнаружил, что конфигурация моего подключения к базе данных неверна: я подключался к старой базе данных с неправильной схемой. Новая схема объявила столбец первичного ключа как

"ID" BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)

поэтому сама база автоматически генерирует первичный ключ, тогда как старая схема объявила ее как

"ID" INTEGER NOT NULL

Спящий режим выполнил правильный код для новой схемы, который не удался по старой схеме, поскольку в старой схеме SQL INSERT указывал значение для столбца ID.

Ответ 4

Спящий режим терпит неудачу в тихом и загадочном ключе, когда столбец идентификатора является Int. Попробуйте изменить его на Long в коде и 64-битное целое число без знака в базе данных. Это исправило проблему для меня.

Ответ 5

Или попробуйте с помощью @GeneratedValue(strategy = GenerationType.AUTO) вместо @GeneratedValue(strategy = GenerationType.SEQUENCE).