Zmiana wartość klucza głównego

0

W aplikacji która działa już dobrych kilka lat zmienił się proces. Do tej pory funkcjonował tak:

  • Zakładamy konto użytkownika
  • Obsługujemy wszystkie procesy w aplikacji (to głównie obieg dokumentów) w oparciu o indywidualny id użytkownika.

Teraz okazuje się że ma działać inaczej:

  • Musze obsłużyć procesy bez danych które pozwolą mi na założenie konta użytkownika.

Brzmi to trochę pokrętnie. W praktyce tabela Users:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sapCode")
@NotNull
private Integer sapCode;

Wartość sapCode uzyskuje w chwili przyjścia pracownika do pracy. Natomiast powinienem jakoś wstawić jego dane do aplikacji 'bez tego kodu' tak aby obsłużyć procesy na 30 dni nim pojawi się w pracy. Nie mam pomysłu jak się za to zabrać, myślałem nad:

  • Wstawieniem fikcyjnego sapCode, a później jego podmianą (razem z relacyjnymi tabelami). Ale to problematycznie z punktu widzenia Hibernate.
  • Można to samo zrobić w SQL zrzucając relacje, zmieniając dane. Ale to wyłącza mi funkcjonowanie aplikacji na pewien czas.

Może coś podpowiecie.

0

Generalne podejście bazodanowe:

Budy (Id,name,surname,other_data)
User (Id,budyId,other_data)
1

Jak już napisał ci @kelog najlepiej byłoby zrobić to dobrze :) Czyli tak, że klucz główny (więc i obcy) nie ma znaczenia biznesowego.
Jeżeli przez przypadek ktoś zdefiniował klucze obce na wszystkich tabelach, w których jest to potrzebne, albo istnieje szansa założenia takich kluczy, to wystarczy zmienić ich zachowanie na on update cascade i zmienić wartość klucza w tej tabeli, resztę załatwi baza danych.

0

Czyli dodaje kolumnę ID bez znaczenia biznesowego. Na sapCode wstawię unique co pozwoli mi zatrzymać relacje do innych tabel na tej kolumnie. Trochę pracy będzie, ale do zrobienia.

1

Na sapCode wstawię unique co pozwoli mi zatrzymać relacje do innych tabel na tej kolumnie

No nie... unikalny indeks nie pozwala wstawić wielu nulli a używanie tego pola jako referencji do innych tabel jest bez sensu.

Praktycznie, najszybciej będzie dorobić kolumnę "newRealSapId", która nie jest kluczem, wypełnić ją szybkim update dla istniejących rekordów i uznać, że to właśnie ona przechowuje potrzebną wartość biznesową. Problem w tym, że jak już ta wartość pokazuje się w 50 różnych tabelach, to różne miejsca w aplikacji korzystają z tych "lokalnych" kopii i będzie z tym potencjalne dużo roboty.

0

A może zwyczajnie dodać pole Hired domyślna wartość false kiedy pojawia się fizycznie to Hired=true wpływa jedynie na możliwość logowania.
Czyli zmiany w 3-ch miejscach: tablica w bazie, logowanie, nowy byt klepnięcie że się pojawił.

1 użytkowników online, w tym zalogowanych: 0, gości: 1