web-dev-qa-db-fra.com

@GeneratedValue (strategy = GenerationType.AUTO) ne fonctionne pas comme prévu

J'essaie de conserver un objet dans une base de données. Continuez à obtenir «L'ID de colonne ne peut pas accepter d'erreur de valeur nulle». Mon objet ressemble à ceci:

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

}

Ma fonction de persistance: 

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

Vous pouvez utiliser GenerationType.TABLE. Ainsi, jpa utilise une table de séquence pour l'assignation id et vous n'aurez peut-être jamais besoin de générer de valeurs de séquence ou d'incrémentation automatique ni de déclencheurs réduisant la portabilité.

Notez également que, dans Java int, le type est lancé avec 0 par défaut, vous pouvez donc vous en débarrasser également.

21
Cem Güler

Dans mon cas, il s'agissait d'un mauvais dialecte:

hibernate.dialect=org.hibernate.dialect.H2Dialect

au lieu de:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

quand je suis passé à la base de données de production. Hibernate a essayé d'utiliser une stratégie préparée pour différents moteurs de base de données.

4
cyprian

J'ai eu un problème avec une manifestation similaire à la vôtre. J'ai finalement découvert que la configuration de ma connexion à la base de données était incorrecte: je me connectais à une ancienne base de données contenant un schéma incorrect. Le nouveau schéma a déclaré la colonne de clé primaire comme

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

so la base de données elle-même générait automatiquement la clé primaire alors que l'ancien schéma le déclarait comme

"ID" INTEGER NOT NULL

Hibernate a exécuté le code correct pour le nouveau schéma, ce qui a échoué sur l'ancien schéma car l'ancien schéma demandait à SQL INSERT de fournir une valeur pour la colonne ID.

2
Raedwald

Hibernate échoue de manière silencieuse et mystérieuse lorsque la colonne ID est un Int. Essayez de le remplacer par Long dans le code et par un entier non signé de 64 bits dans la base de données. Cela a résolu le problème pour moi.

1
Alex R

Ou essayez avec @GeneratedValue(strategy = GenerationType.AUTO) Au lieu de @GeneratedValue(strategy = GenerationType.SEQUENCE).

0
Abdennour Toumi