@GeneratedValue(стратегия = GenerationType.Авто) не работает как мысль

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

    @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;
    }

}

моя функция сохранения:

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;
    }

5 ответов


вы можете использовать GenerationType.ТАБЛИЦА. Таким образом, jpa использует таблицу последовательности для назначения идентификаторов, и вам может никогда не понадобиться генерировать значения последовательности или автоматического приращения или триггеры, снижающие переносимость.

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


в моем случае речь шла о плохом наречии:

hibernate.dialect=org.hibernate.dialect.H2Dialect

вместо:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

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


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

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

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

"ID" INTEGER NOT NULL

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


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


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