Để sử dụng MySQL AUTO_INCREMENT
, bạn phải sử dụng IDENTITY
chiến lược:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
Đó là những gì bạn nhận được khi sử dụng AUTO
với MySQL:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
Điều này thực sự tương đương với
@Id @GeneratedValue
private Long id;
Nói cách khác, ánh xạ của bạn sẽ hoạt động. Nhưng Hibernate nên bỏ qua id
trong câu lệnh chèn SQL, và nó không phải. Chắc hẳn ở đâu đó có một kiểu không khớp.
Bạn đã chỉ định phương ngữ MySQL trong cấu hình Hibernate của mình chưa (có thể là MySQL5InnoDBDialect
hoặc MySQL5Dialect
tùy thuộc vào động cơ bạn đang sử dụng)?
Ngoài ra, ai đã tạo ra bảng? Bạn có thể hiển thị DDL tương ứng không?
Tiếp theo: Tôi không thể tái tạo vấn đề của bạn. Sử dụng mã của của bạn thực thể và của bạn DDL, Hibernate tạo SQL (dự kiến) sau với MySQL:
insert
into
Operator
(active, password, username)
values
(?, ?, ?)
Lưu ý rằng id
không có trong câu lệnh trên, như mong đợi.
Tóm lại, mã của bạn, định nghĩa bảng và phương ngữ là chính xác và mạch lạc, nó sẽ hoạt động. Nếu nó không phù hợp với bạn, có thể có thứ gì đó không đồng bộ (tạo bản dựng sạch sẽ, kiểm tra kỹ thư mục bản dựng, v.v.) hoặc có gì đó khác chỉ là sai (kiểm tra nhật ký xem có bất kỳ điều gì đáng ngờ).
Về phương ngữ, chỉ sự khác biệt giữa MySQL5Dialect
hoặc MySQL5InnoDBDialect
là sau này thêm ENGINE=InnoDB
vào các đối tượng bảng khi tạo DDL. Sử dụng cái này hay cái kia không thay đổi SQL được tạo.