Witam. Zastanawiam się jaki jest najlepszy sposób walidacji pól obiektu, które powinny być unikalne. Załóżmy, że mamy najprostszą klasę:
class Product() {
String name;
String description;
BigDecimal price;
}
Nasza tabela w bazie danych odwzorowująca obiekt ma oznaczone pole name jako UNIQUE. W jaki sposób najlepiej zwalidować poprawność danych przed dodaniem kolejnego produktu? Pierwszy sposób jaki mi przychodzi do głowy, to, że mamy jakąś klasę walidującą i wygląda to tak:
- Sprawdzamy poprawność pól name, description czy nie są puste, czy price nie jest ujemne itp.
- Wykonujemy proste zapytanie sqlowe select * from products where name = "xxxx"; jeśli ono zwróci nam jakiś wynik to wyświetlamy informacje, że produkt w bazie już istnieje, jeśli nie to punkt kolejny
- Zapisujemy w bazie danych obiekt produkt.
Wydaje mi się jednak, że nie jest to najlepszy sposób bo pomiędzy punktem 2 i 3 ktoś, może nas uprzedzić i wtedy przy wykonaniu podpunktu 3 poleci wyjątek przy próbie zapisu, np. w springu: DuplicateKeyException
Drugi sposób jaki mi przychodzi do głowy to scenariusz, w którym usuwamy sprawdzanie z punktu 2 a w punkcie 3 łapiemy wyjątek:
public Optional<String> save(Product product)
try {
entityManager.persist(product);
return Optional.empty();
} catch(DuplicateKeyException e) {
return Optional.of("Duplicated key");
}
}
albo w metodzie zamiast Optionala jakis Either z vavra.
Jakie jest najlepsze podejście w takim przypadku? Drugie pytanie skoro łapiemy np. DuplicateKeyException to czy należy łapać inne wyjątki jakie mogą wyniknąć przy persist czy innych metodach CRUDowych w JPA? Są to wyjątki unchecked, więc chyba nie powinno się ich łapać, ale z 2 strony jeśli po stronie serwera wyniknie taki błąd przy persist to wtedy użytkownik nie dostanie komunikatu o błędzie, tylko poleci jakiś wpis do logów