JPA brak aktualizacji ID tabeli po usunięciu rekordu

0

Witam, mam problem początkującego otóż posiadam encję będącą bazą

@Entity
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_category")
    private Long id;

    @Column(nullable = false)
    private String catename;

    @OneToMany(mappedBy = "category", cascade = CascadeType.REMOVE)
    private List<Words> words = new ArrayList<>();

posiada ona parę rekordów, które mogą być usunięte przez użytkownika.
Użytkowni dostaje w widoku tabelę za pomocą metody GET gdzie mam możliwość usunięcia rekordu.
Informacja te przechodzi przez metodę POST, w której otrzymuje nazwę tabeli do usunięcia i usuwa ją w Service.

public void deleteCategory(String catename){
       categoryDAO.deleteByCatename(catename);
   }

Service bazuje na JPA Repository i usuwa ją.

@Repository
public interface CategoryDAO extends JpaRepository <Category, Long> {
    
    @Transactional
    void deleteByCatename(String catename);

}

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/ab?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=create-drop

server.port=8002
spring.jpa.show-sql=true

No i problem się zaczyna, gdy użytkownik usunie z tabeli dany rekord będący np. 3 elementem to ID tabeli nie dostosowuje się pod to, zero aktualizacji!
screenshot-20210921123000.png -->>> screenshot-20210921123612.png

Jeżeli usunę wszystkie rekordy i dodam nowy to ID_category jest już w ogóle przesadnie duże. screenshot-20210921123808.png

Co robić !?

2

Hibernate zapisuje sobie ostatnie nadane id i nadaje kolejnemu rekordowi o 1 więcej, aby nie doszło do sytuacji gdzie usuwasz dany zasób, a po chwili pojawia się nowy zasób w te same id. Jeśli chcesz aby id nadawało się od nowa to możesz zrobić truncate albo nadać wartość
https://stackoverflow.com/questions/60418867/hibernate-reset-id-to-1-after-deleting-all-records-from-entity/60419865#60419865
Moim zdaniem nie warto grzebać przy strategii nadawania id oraz id nie powinno być udostępniane rest api, możesz sobie stworzyć domenowe id które będziesz prezentować użytkownikom

4
Arric napisał(a):

Jeżeli usunę wszystkie rekordy i dodam nowy to ID_category jest już w ogóle przesadnie duże. screenshot-20210921123808.png

Co robić ?

Nic.
7, 100,10000 to nie jest przesadnie dużo. Co więcej koncepcja ponownego użycia już kiedyś istniejących id wiąże się z ryzykiem wielu subtelnych błędów w logice i bezpieczeństwie. Normalnie nie robi się tego.

7

o_O niby czemu oczekiwałbyś takiego efektu. Nic takiego nie ma miejsca i nie powinno. Przecież to byłby jakiś hardkor jakby usunięcie pierwszego wiersza z bazy wymagało updatowania wszystkich rekordów w tabeli (a mogą ich być miliony, a może to nawet być rozproszone na wiele instancji i jeszcze zreplikowane na drugim końcu świata). Co więcej, to wymagałoby updatowania w ogóle całej bazy, bo przecież są klucze obce w innych tabelach. Po czymś takim jeszcze przebudować indeksy i przeliczyć statystyki dla optymalizatora kosztowego. Takie jedno usunięcie mogłoby kosztować kilka godzin niedostępnej bazy. Genialny pomysł.

Już nawet nie mówię o bardziej trywialnym problemie, że user 1 usunął wiersz 3 jak w twoim przykładzie, a user 2 chciał usunąć wiersz 4 i wysłał taki właśnie request, bo kiedy ładował mu sie frontend to rekord który chciał usunąc miał id 4. Ale przez to że "przesunąłeś ID", to user 2 usunął zupełnie inny rekord. Jak ty sobie to wyobrażasz? Przecież coś takiego nie ma prawa działać.

0

Widocznie w głowie mam jeszcze takiego excela gdzie wszystko mam mieć sens dla oka, gdzie wszystko jest poukładane.
Sam tutaj korzystam z relacji i w sumie sądziłem że da się zrobić tak, że aktualizacja i w relacjach sama poukłada klucze obce. Dzięki jedna odpowiedź a rozumiem.

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