Myślałem że znam już całkowicie temat generatorów PK w JPA ale właśnie naszła mnie pewna wątpliwość na którą nie mogę znaleźć odpowiedzi w dokumentacji. Załóżmy że ma klasę encji z PK typu int. Domyślna wartość dla tego pola jest jeden
@Id
int my_pk = 1
Jeżeli nie zastosuje strategi generowania PK przez jakiś typ generatora to numery jakie podam do pola "my_pk" obiektów encji będą (po ich persistowaniu lub mergowaniu) numerami PK tworzonych w rekordów w tabeli. Jak tworzę jakiś obiekt encji to standardowo metoda "merge" po numerze pola "my_pk" tej encji musi rozpoznać czy rekord już istnieje (wtedy wiąże encję z tym rekordem) lub czy go jeszcze nie ma w tabeli (rekord zostanie stworzony przy committowaniu). Podobnie jest z "persist()" które tworzy nowy obiekt dla encji gdy taki rekord nie istnieje lub wyrzuca Exception gdy jednak jest (przy comittowaniu).
Ale jak to działa przy zastosowaniu Generatora wartości PK (IDENTITY, SEQUENCE lub TABLE ). Załóżmy ze moja tabela ma w bazie am jż kilka pierwszych rekordów (1,2,3,4). Gdy tworzę nowy obiekt encji jego wartośc pola PK ("my_pk") równa się domyślnemu 1.
JPA provider powinien ją uznać ten obiekt encji za odpowiednik istniejącego rekordu (z nr 1) i dla "merge()" powinien związać tą encja z istniejącym rekordem a dla persist powinien wyrzucić EntityExistsException. Jednak tak się nie dzieje i encje traktowane są jak nowe które należy dodać do bazy w postaci nowych rekordów. Jak JPA provider dokonuje tutaj tego rozpoznania jaki obiekt encji jest nowy?
Jak widać nie robi tego po polu "my_pk".