Sugerowałbym zajęcie się tym problemem z innej perspektywy:
-
dodaj nową kolumnę, wewnętrzną, nazwij ją lcname (oznacza nazwę pisaną małymi literami)
@NotEmpty @Column(nullable = false) private String lcname;
-
zmień ograniczenie ustawione jako adnotacja, aby zamiast tego używało nowego pola:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
zmodyfikuj ustawiacz nazw, aby ustawić lcname z małą literą oryginalnej nazwy dostarczonej przez klienta
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Otóż to. Za każdym razem, gdy encja zostanie utrwalona, zapisana zostanie również nazwa pisana małymi literami. W ten sposób, jeśli zapiszesz „A”, będziesz miał zapisany rekord z lcname =„a”, a następnym razem, gdy spróbujesz zapisać encję o nazwie „a”, operacja się nie powiedzie z powodu ograniczenia lcname.Zmiana jest całkowicie przezroczysta każdemu, kto pobierze jednostkę z bazy danych, ponieważ lcname jest prywatne i nie ma dla niego pobierającego, podczas gdy oryginalna getName zwróci oryginalną nazwę podaną początkowo przez klienta, który ją utworzył.