2011-02-26 9 views
17

Sto cercando di mantenere un oggetto in un database. Continua a ricevere "L'ID della colonna non può accettare l'errore del valore nullo". Il mio scopo è simile al seguente:@GeneratedValue (strategy = GenerationType.AUTO) non funziona come un pensiero

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

} 

la mia persistono funzione:

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

risposta

19

È possibile utilizzare GenerationType.TABLE. In questo modo, jpa utilizza una tabella di sequenza per l'identificazione id e potrebbe non essere necessario generare sequenze o valori di incremento automatico o trigger che riducono la portabilità.

Si noti inoltre che in java int il tipo è iniziato con 0 predefinito, quindi è possibile eliminare anche quello.

+0

@Null: quindi accettare la risposta (facendo clic sul segno di spunta accanto) in modo che il cguler ottenga una piccola ricompensa per averlo offerto. Fare ciò aiuta anche a incoraggiare gli altri a rispondere bene alle altre domande. –

+1

@cguler Questo ha funzionato anche per me, ma non so perché GenerationType.Table funzioni e Auto no. Puoi spiegarmi o riferirmi? –

+2

@ChristianVielma il punto è, AUTO assume automaticamente IDENTITÀ. Potrebbe essere necessario provare il GenerationType.IDENTITY esplicitamente e vedere se funziona per vedere se si tratta di un problema con l'impostazione AUTO. Ma probabilmente la tua configurazione di db non la supporta. Tuttavia GenerationType.TABLE crea una tabella e la usa per generare le chiavi e questa impostazione dovrebbe funzionare su tutti gli rdbms. Spero che questo aiuti :) –

0

Oppure provare con @GeneratedValue(strategy = GenerationType.AUTO) anziché @GeneratedValue(strategy = GenerationType.SEQUENCE).

+2

o prova @Id @GeneratedValue (strategia = GenerationType.IDENTITY) –

2

Ho avuto un problema con una manifestazione simile alla tua. Alla fine ho scoperto che la configurazione della mia connessione al database era sbagliata: mi stavo connettendo a un vecchio database con uno schema errato. Il nuovo schema ha dichiarato la colonna chiave primaria come

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

così the database itself automatically generated the primary key mentre il vecchio schema ha dichiarato come

"ID" INTEGER NOT NULL

Hibernate eseguito il codice corretto per il nuovo schema, che non è riuscito sul vecchio schema perché t Il vecchio schema richiedeva che l'SQL INSERT fornisse un valore per la colonna ID.

1

Hibernate non riesce in modi silenziosi e misteriosi quando la colonna ID è un Int. Prova a cambiarlo in Lungo nel codice e in un numero intero a 64 bit senza segno nel database. Questo ha risolto il problema per me.

4

Nel mio caso si trattava di cattiva dialetto:

hibernate.dialect=org.hibernate.dialect.H2Dialect 

invece di:

hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect 

quando sono passato al database di produzione. Hibernate ha provato a utilizzare la strategia preparata per diversi motori db.

Problemi correlati