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.