2009-02-24 10 views
18

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.)

+9

+1 za "prawie nieakceptowalną krzywą uczenia się" –

+0

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

+0

Hibernate 5.x nie używa już IDENTITY podczas określania GenerationType.AUTO. Zamiast tego wyszukuje tabelę hibernacji dla następnego identyfikatora. – Mohsen

Odpowiedz

28

wierzę chcesz GenerationType.IDENTITY. MySql nie używa tabeli ani sekwencji do generowania wartości identyfikatora.

+0

Cześć Clint, i dzięki za odpowiedź. Masz rację. Ale to początkowo nie rozwiązało mojego problemu, ponieważ miałem subtelny, odrażający problem leżący u podstaw wszystkiego. Opublikuję odpowiedź pod moim pierwotnym pytaniem. –

+3

Er, zmieniłem zdanie, odpowiem na to tutaj. używałem hibernate.cfg.xml spiłować stronę internetową jakiegoś kolesia, a on miał w tym: tworzyć To sprawiło, że system ponownie utworzyć mój przy każdym uruchomieniu aplikacji. Komentowanie go rozwiązało problem. –

+0

Mężczyzna Miałem dokładnie ten sam problem z stwórz, thx za znalezienie go; p – finpingvin

1

używam następujące z auto_increment, działa perfekcyjnie:

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "db_id", unique = true, nullable = false) 
public Long getDbId() { 
    return this.dbId; 
} 

public void setDbId(Long dbId) { 
    this.dbId = dbId; 
} 
5

Napisałem to w komentarzu pod zaakceptowanej odpowiedzi, ale te nie są pokazywane domyślnie, więc opublikuję go ponownie jako odpowiedź.

używałem hibernate.cfg.xml spiłować stronę internetową jakiegoś kolesia, a on miał w tym:

<property name="hibernate.hbm2ddl.auto">create</property> 

To sprawiło, że system ponownie utworzyć mój stół każdorazowo Pobiegłem aplikację. Komentowanie go rozwiązało problem.

Pozostałe dwie odpowiedzi dotyczące różnych sposobów tworzenia identyfikatorów są poprawne.Mój pierwotny problem polegał na symptomach wydawał się robić z generowaniem ID, ale prawdziwą przyczyną była błędna konfiguracja.

+0

Możesz również ustawić tę wartość na "aktualizuj", jeśli chcesz, aby automatycznie dopasować bazę danych do ustawień bez upuszczenie danych. Dokumenty: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/session-configuration.html#configuration-misc-properties – rjferguson

Powiązane problemy