@GeneratedValue (стратегии = GenerationType.AUTO) не работает, как думал - PullRequest
18 голосов
/ 26 февраля 2011

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

    @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 ]

22 голосов
/ 26 февраля 2011

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

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

4 голосов
/ 30 ноября 2015

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

hibernate.dialect=org.hibernate.dialect.H2Dialect

вместо:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

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

2 голосов
/ 26 августа 2012

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

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

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

"ID" INTEGER NOT NULL

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

1 голос
/ 27 июня 2015

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

0 голосов
/ 25 марта 2012

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

...