webentwicklung-frage-antwort-db.com.de

@GeneratedValue (Strategie = GenerationType.AUTO) funktioniert nicht wie gedacht

Ich versuche, ein Objekt in einer Datenbank zu speichern. Erhalten Sie weiterhin "Spalten-ID kann keinen Nullwertfehler akzeptieren". Mein Objekt sieht so aus:

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

}

Meine persist Funktion: 

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

Sie können GenerationType.TABLE verwenden. Auf diese Weise verwendet jpa eine Sequenztabelle für die Zuweisung von IDs, und Sie müssen möglicherweise niemals Sequenz- oder Auto-Inkrement-Werte generieren oder auslösen, was die Portabilität verringert.

Beachten Sie auch, dass der Int-Typ in Java mit dem Standardwert 0 initiiert wird, so dass Sie diesen auch entfernen können.

21
Cem Güler

In meinem Fall ging es um schlechten Dialekt:

hibernate.dialect=org.hibernate.dialect.H2Dialect

anstatt:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

als ich zur Produktionsdatenbank wechselte. Hibernate hat versucht, eine für verschiedene DB-Maschinen vorbereitete Strategie zu verwenden.

4
cyprian

Ich hatte ein Problem mit einer ähnlichen Manifestation wie bei Ihnen. Ich entdeckte schließlich, dass die Konfiguration meiner Datenbankverbindung falsch war: Ich stellte eine Verbindung zu einer alten Datenbank her, die ein falsches Schema hatte. Das neue Schema hat die Primärschlüsselspalte als deklariert

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

so die Datenbank selbst hat automatisch den Primärschlüssel generiert während das alte Schema dies als deklariert hat

"ID" INTEGER NOT NULL

Hibernate hat den korrekten Code für das neue Schema ausgeführt, der im alten Schema fehlgeschlagen ist, weil das alte Schema die SQL-Variable INSERT verlangt, die einen Wert für die Spalte ID bereitstellt.

2
Raedwald

Ruhezustand schlägt auf stille und mysteriöse Weise fehl, wenn die ID-Spalte ein Int ist. Ändern Sie es im Code in Long und in der Datenbank in eine 64-Bit-Ganzzahl ohne Vorzeichen. Das hat das Problem für mich behoben.

1
Alex R

Oder versuchen Sie es mit @GeneratedValue(strategy = GenerationType.AUTO) Anstelle von @GeneratedValue(strategy = GenerationType.SEQUENCE).

0
Abdennour Toumi