Aby użyć MySQL AUTO_INCREMENT
kolumna, powinieneś użyć IDENTITY
strategia:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
Co otrzymasz, używając AUTO
z MySQL:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
Co w rzeczywistości jest odpowiednikiem
@Id @GeneratedValue
private Long id;
Innymi słowy, twoje mapowanie powinno działać. Ale Hibernate powinien pominąć id
w instrukcji SQL INSERT, a tak nie jest. Gdzieś musi być jakieś niedopasowanie.
Czy określiłeśdialekt MySQL w konfiguracji Hibernate (prawdopodobnie MySQL5InnoDBDialect
lub MySQL5Dialect
w zależności od używanego silnika)?
A kto stworzył stół? Czy możesz pokazać odpowiedni kod DDL?
Kontynuacja: Nie mogę odtworzyć twojego problemu. Korzystanie z kodu swojego podmiot i Twój DDL, Hibernate generuje następujący (oczekiwany) SQL z MySQL:
insert
into
Operator
(active, password, username)
values
(?, ?, ?)
Zauważ, że id
kolumna jest nieobecna w powyższym oświadczeniu, zgodnie z oczekiwaniami.
Podsumowując, Twój kod, definicja tabeli i dialekt są poprawne i spójne, powinno działać. Jeśli tak nie jest, być może coś nie jest zsynchronizowane (wykonaj czystą kompilację, dwukrotnie sprawdź katalog kompilacji itp.) lub coś innego jest po prostu nie tak (sprawdź logi pod kątem podejrzanych).
Jeśli chodzi o dialekt, jedyny różnica między MySQL5Dialect
lub MySQL5InnoDBDialect
jest to, że później dodaje ENGINE=InnoDB
do obiektów tabeli podczas generowania kodu DDL. Użycie jednego lub drugiego nie zmienia wygenerowanego kodu SQL.