Mysql
 sql >> Database >  >> RDS >> Mysql

Come annotare il campo di incremento automatico MYSQL con le annotazioni JPA

Per usare un MySQL AUTO_INCREMENT colonna, dovresti usare un IDENTITY strategia:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

Che è ciò che otterresti usando AUTO con MySQL:

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

Che in realtà è equivalente a

@Id @GeneratedValue
private Long id;

In altre parole, la tua mappatura dovrebbe funzionare. Ma Hibernate dovrebbe omettere id colonna nell'istruzione di inserimento SQL e non lo è. Dev'esserci una specie di mancata corrispondenza da qualche parte.

Hai specificato un dialetto MySQL nella configurazione di Hibernate (probabilmente MySQL5InnoDBDialect o MySQL5Dialect a seconda del motore che usi)?

Inoltre, chi ha creato la tabella? Puoi mostrare il DDL corrispondente?

Seguito: Non riesco a riprodurre il tuo problema. Utilizzando il codice del tuo entità e tuo DDL, Hibernate genera il seguente SQL (previsto) con MySQL:

insert 
into
    Operator
    (active, password, username) 
values
    (?, ?, ?)

Nota che l'id colonna è assente dalla dichiarazione di cui sopra, come previsto.

Per riassumere, il tuo codice, la definizione della tabella e il dialetto sono corretti e coerenti, dovrebbe funzionare. In caso contrario, forse qualcosa non è sincronizzato (fai una build pulita, ricontrolla la directory di build, ecc.) o qualcos'altro è semplicemente sbagliato (controlla i log per qualsiasi cosa sospetta).

Per quanto riguarda il dialetto, il solo differenza tra MySQL5Dialect o MySQL5InnoDBDialect è che il successivo aggiunge ENGINE=InnoDB agli oggetti tabella durante la generazione del DDL. L'uso dell'uno o dell'altro non cambia l'SQL generato.