Próbuję dowiedzieć się, jak działa Hibernate, a ja wpadam w niedopuszczalną krzywą uczenia się. Nie mogę zobaczyć, jak uzyskać Hibernate, aby przestrzegać zasady auto_inrement dla moich obiektów. Zamiast tego jest nadpisanie wpisów w bazie danych z istniejących identyfikatorów, poczynając od 1.Hibernacja nieprzestrzegająca pola kluczowego auto_increment klucza głównego MySQL
Mam proste Foo
obiekt, poparte tabeli MySQL zdefiniowane następująco:
CREATE TABLE `Foo` (
`fooId` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`fooId`),
)
I potwierdziły, że wstawienie wielokrotność Obiekty Foo ręcznie z SQL (insert into Foo values();
) mają słuszność.
klasa My Java ma identyfikator określony za pomocą adnotacji tak:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="fooId")
private Integer id;
I następnie wykonać jakiś kod testowy, który po prostu tworzy wystąpienie obiektów Foo i zapisuje je do bazy danych (przy użyciu session.save(obj)
). Wygląda na to, że używa własnej sekwencji kluczy podstawowych, począwszy od pierwszej, i nie analizuje kluczowych zasad tabeli. Nadpisuje to, co tam było.
Próbowałem wariacji na bicie @GeneratedValue
(przy użyciu wszystkich możliwych strategii, pomijając klauzulę rodzicielską). Ktoś zasugerował nawet całkowite odejście od GeneratedValue
. Nic nie działa.
Czy zostawiam coś? czego mi brakuje? Czy Hibernate jest naprawdę tak trudny?
(Jeśli ktoś ma alternatywną opcję trwałości bazy danych Java, proszę sugerować jeden. Robię prototypów, nie długotrwałe projekty mondo inżynierii.)
+1 za "prawie nieakceptowalną krzywą uczenia się" –
Ditto. Hibernacja nie jest tak płynną jazdą jak EJB2, a wiele z tego ma związek z tym, że deweloperzy odmawiają wsparcia z powodów technicznych. – Zds
Hibernate 5.x nie używa już IDENTITY podczas określania GenerationType.AUTO. Zamiast tego wyszukuje tabelę hibernacji dla następnego identyfikatora. – Mohsen