2009-02-24 17 views
18

Sto cercando di capire come funziona Hibernate e sto correndo verso una curva di apprendimento quasi inaccettabile. Non riesco a vedere come ottenere Hibernate per rispettare la politica auto_increment per i miei oggetti. Invece, sovrascrive voci nel database con ID esistenti, a partire da 1.Hibernate non rispettando il campo chiave primaria MySQL auto_increment

Ho una semplice Foo oggetto, sostenuto da una tabella MySQL definito così:

CREATE TABLE `Foo` (
    `fooId` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`fooId`), 
) 

mi hanno confermato che l'inserimento multiplo Foo oggetti a mano con SQL (insert into Foo values();) fa la cosa giusta.

classe mia Java ha l'ID specificato utilizzando le annotazioni in questo modo:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="fooId") 
private Integer id; 

Ho poi eseguire del codice di prova che crea un'istanza semplicemente oggetti Foo e li salva nel database (utilizzando session.save(obj)). Sembra che usi la propria sequenza di chiavi primarie, iniziando da una, e non guardi la politica chiave della tabella. Sovrascrive quello che c'era.

Ho provato le variazioni sul bit @GeneratedValue (utilizzando tutte le strategie possibili, escludendo la clausola parentetica). Qualcuno ha persino suggerito di lasciare il GeneratedValue completamente. Niente sembra funzionare.

Sto lasciando qualcosa fuori? Cosa mi manca? Hibernate è davvero così difficile?

(Se qualcuno ha una soluzione alternativa di persistenza del database Java, si prega di suggerire uno. Sto facendo prototipi, non di lunga durata progetti Mondo-ingegnerizzato.)

+9

+1 per "curva di apprendimento quasi inaccettabile" –

+0

Ditto. Hibernate non è così fluida come lo era EJB2, e molto di questo ha a che fare con gli sviluppatori che si rifiutano di supportare le cose piuttosto che ragioni tecniche. – Zds

+0

Hibernate 5.x non utilizza più IDENTITY quando si specifica GenerationType.AUTO. Invece cerca la tabella hibernate_sequence per il prossimo id. – Mohsen

risposta

28

credo che si desidera GenerationType.IDENTITY. MySql non usa una tabella o una sequenza per generare il valore Id.

+0

Ciao Clint, e grazie per la risposta. Hai ragione. Ma inizialmente non risolveva il mio problema, perché avevo un problema sottile e odioso alla base di tutto. Pubblicherò la mia risposta sotto la mia domanda originale. –

+3

Ehm, ho cambiato idea, mi limiterò a rispondere qui. Io sto usando un hibernate.cfg.xml limare sito web di qualche amico, e aveva questo: creare Ciò ha reso il sistema di ri-creare il mio tabella ogni volta che ho eseguito la mia app. Commentandolo risolto il problema. –

+0

Man ho avuto lo stesso identico problema con crea, thx per trovarlo; p – finpingvin

1

Io uso il seguente con auto_increment, funziona perfettamente:

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "db_id", unique = true, nullable = false) 
public Long getDbId() { 
    return this.dbId; 
} 

public void setDbId(Long dbId) { 
    this.dbId = dbId; 
} 
5

ho scritto questo in un commento sotto la risposta accettata, ma questi non sono mostrati per impostazione predefinita, quindi lo inserirò di nuovo come risposta.

Io sto usando un hibernate.cfg.xml limare sito web di qualche amico, e aveva questo:

<property name="hibernate.hbm2ddl.auto">create</property> 

Ciò ha reso il sistema per ricreare il mio tavolo ogni volta che ho incontrato la mia app. Commentandolo risolto il problema.

Le altre due risposte sui vari modi di creare ID sono corrette.Il problema del problema originale sembrava avere a che fare con la generazione dell'ID, ma la causa effettiva era l'errata configurazione.

+0

Puoi anche impostare quel valore su 'update' se desideri che corrisponda automaticamente al database alle tue impostazioni senza lasciando cadere i dati. I documenti: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/session-configuration.html#configuration-misc-properties – rjferguson

0

Si potrebbe desiderare di avere uno sguardo a: http://hibernatepojoge.sourceforge.net/

Essa sostiene di creare un'applicazione completamente funzionante (primavera, hibernate, test JUnit, ecc) semplicemente puntando ad un DB.

Problemi correlati