Domyślnym generatorem identyfikatorów dla PostgreSQL w Hibernate jest SequenceGenerator [1]. , np. Hibernacja wykona SELECT nextval('hibernate_sequence')
, aby wygenerować identyfikator przed wykonaniem INSERT foo (id, ...) VALUES (123, ...)
przy zatwierdzaniu sesji.Dlaczego jest domyślny generator Hibernate dla PostgreSql "SequenceGenerator", a nie "IdentityGenerator"?
Jednak PostgreSql obsługuje kolumny autoincrement id (patrz np. [2]), a domyślnym generatorem dla wszystkich innych baz danych obsługujących autoinkrement jest użycie tej cechy [3], a także wykonanie insertów pomijających wartość id i zapytanie baza danych dla nowego identyfikatora (przed zatwierdzeniem sesji, ale w ramach transakcji sesji).
Widziałem niedawną dyskusję [4] sugerującą, że poprzednia strategia jest ogólnie lepsza ze względu na niedopasowanie wstawiania przed sesją-popełnieniem.
Jeśli SequenceGenerator jest lepszy (jak na [4]), dlaczego nie jest domyślny dla baz danych, które go obsługują (patrz [3])?
Jeśli IdentityGenerator jest lepszy, dlaczego PostgreSql jawnie wybiera SequenceGenerator, gdy Postgres obsługuje ten pierwszy (jak na [2])?
Próbowałem znaleźć historię decyzji o zmianie domyślnej w dialekcie PostgreSQL (patrz [1]), ale nie mogłem znaleźć odpowiedniego zatwierdzenia w GitHub. Podążyłem za kodem z powrotem do repozytorium SVN, ale szlak robi się zimny, gdy w r11563 dodano plik PostgreSQLDialect z nieprzydatnym komunikatem "migracja maven" [5]. Nie mogę dłużej śledzić historii. Czy każdy może znaleźć zatwierdzenie, które dodało to zastąpienie? Być może w wiadomości o zatwierdzeniu jest więcej informacji.
Z góry dziękuję.
[4] http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators-revealed.aspx
Zakładam, że dzieje się tak dlatego, że typ danych "serial" jest po prostu "sekwencją w przebraniu". –
To nie wyjaśnia tego - wszystkie kolumny autoinkrementacji są sekwencjami w przebraniu. – Rich
nie, nie dla SQL Server lub MySQL, gdzie nie można uzyskać następnej wartości bez wykonywania tej wstawki (co jest dużą różnicą między rozwiązaniem opartym na sekwencji a "automatycznym inkrementowaniem"). –