2012-08-17 12 views
5

Zostałem poproszony o ponowne uruchomienie sekwencji dla wielu różnych kolumn szeregowych w bazie danych PostgreSQL. Normalnie po prostu użyłbym:Jak zrestartować sekwencje PostgreSQL obsługiwane przez Hibernate?

ALTER SEQUENCE serial RESTART WITH 105; 

Wygląda jednak na to, że do obsługi sekwencji bazy danych używany jest Hibernate. Naprawdę nie wiem nic o Hibernate, ale rozumiem, że hibernate_sequence to globalna sekwencja dla wszystkich tabel. Czy to jest poprawne?

jestem przy założeniu, że muszę wykonać następujące czynności, a następnie:

ALTER SEQUENCE hibernate_sequence RESTART WITH 105; 

Ale nie jestem pewien, co w konsekwencji będzie. Załóżmy, że mam tabele A, B, C i D. Każda z tych tabel ma kolumnę ID typu serial. Czy powyższa instrukcja SQL w hibernate_sequence zrestartuje kolumnę ID dla WSZYSTKICH tabel?

Dzięki!

Odpowiedz

4

Po pierwsze, nie jest podwładnym problem tutaj: Jesteś leczenia wartość sekwencji jak mają na myśli coś. Zobacz koniec odpowiedzi.

Teraz z Hibernate, to zależy od tego w jaki sposób użytkownik ustawił mapowania. Dobrze skonfigurowana instancja Hibernacji użyje tych samych sekwencji, co wszystkie pozostałe.

Niestety, większość mapowania nie są bardzo dobre - albo raczej, myślę, że domyślne zachowanie Hibernate jest straszna i zawsze powinny być nadpisane. Domyślna używana sekwencja jest rzeczywiście udostępniona hibernate_sequence dla wszystkich tabel. Jednakże, jest to całkiem możliwe, aby mieć kilka tabele wykorzystując własne sekwencje i inne tabele przy użyciu udostępnionego hibernate_sequence, lub mieć wszystkie tabele prawidłowo używając własne sekwencje.

Aby włączyć ostateczną odpowiedź trzeba by zamieścić swoje mapowania.

Jeśli tabela (y), które chcesz zmienić, generowanie identyfikatorów używa poprawnych sekwencji dla ich tabel w odwzorowaniach w trybie hibernacji, możesz po prostu wykonać tę sekwencję. Jeśli odwzorowania są realizowane za pośrednictwem JPA, odbywa się to za pomocą @SequenceGenerator i @GeneratedValue z . Jeśli jest to wykonywane przez orm.xml, hbm.xml lub adnotacje w stylu hibernacji w starym stylu, musisz sprawdzić instrukcję. Lub, jeśli Hibernate jest jedynym klientem, który zapisuje do DB, spójrz na sekwencje, aby zobaczyć, czy idą w górę przy użyciu SELECT * FROM sequence_name.

Jeśli mapowania dla interesujących tabel używają udostępnionego hibernate_sequence, prawdopodobnie nie możesz zrobić tego, czego chcesz, bez naprawiania mapowań Hibernate. Będziesz musiał zmienić mapowania, aby mapowanie dla interesujących tabel używało innej sekwencji, następnie `LOCK TABLE i ustaw punkt początkowy dla tych sekwencji na najwyższy wiersz aktualnie w tabeli.

Sekwencje: Dlaczego potrzeba zmienić lub ponownie uruchomić sekwencję? Nie powinno to mieć znaczenia, ponieważ syntetyczny klucz podstawowy jest po prostu pozbawioną znaczenia liczbą, którą porównuje się do równości z innymi liczbami bez znaczenia. W czym problem próbujesz rozwiązać?

+0

Mapowania są wykonywane za pomocą JPA, więc na przykład wszystkie klasy (mapowane do bazy danych jako tabele) mają "Identyfikator całkowity = -1" zdefiniowany z odwzorowaniem jako "@GeneratedValue (strategy = GenerationType .SEKWENCJA)".Ponieważ istnieje tylko jedna sekwencja w bazie danych (hibernacja_sekwencja), a ponieważ istnieją luki między wartościami ID we wszystkich różnych tabelach, myślę, że można bezpiecznie założyć, że domyślna sekwencja jest wspólna dla wszystkich, jak już wspomniano. Sekwencję należy zrestartować dla wszystkich tych tabel, aby uniknąć pewnych konfliktów podczas przesyłania bazy danych. – littleK

+0

Jeszcze raz dziękuję za pomoc, bardzo pouczające. – littleK

+1

@littleK Bez problemu. Mam nadzieję, że to trochę pomaga. Łączenie baz danych ... um ... "zabawa". Specjalna zabawa. Mam nadzieję, że kupiłeś dużo ginu. –

Powiązane problemy