Suggerirei di affrontare questo problema da un'angolazione diversa:
-
aggiungi una nuova colonna, interna, chiamala lcname (sta per nome in minuscolo)
@NotEmpty @Column(nullable = false) private String lcname;
-
cambia il vincolo che hai impostato come annotazione per utilizzare invece il nuovo campo :
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
modificare il name setter per impostare anche lcname con una minuscola del nome originale fornito dal client
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Questo è tutto. Ogni volta che l'entità verrà resa persistente, verrà salvato anche un nome in minuscolo. In questo modo se salvi "A" avrai un record con lcname ="a" salvato, e la prossima volta che proverai a salvare un'entità con nome "a" l'operazione fallirà a causa del vincolo su lcname La modifica è completamente trasparente a chiunque prenda un'entità dal database poiché lcname è privato e non esiste un getter per esso, mentre getName originale restituirà il nome originale fornito inizialmente dal client che lo ha creato.