Ik stel voor om dit probleem vanuit een andere hoek aan te pakken:
-
voeg een nieuwe kolom toe, interne, noem het lcname (staat voor naam in kleine letters)
@NotEmpty @Column(nullable = false) private String lcname;
-
verander de beperking die je als annotatie hebt ingesteld om in plaats daarvan het nieuwe veld te gebruiken:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
wijzig de naamzetter om ook lcname in te stellen met een kleine letter van de originele naam die door de klant is opgegeven
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Dat is het. Elke keer dat de entiteit wordt behouden, wordt ook een naam in kleine letters opgeslagen. Op die manier, als je "A" opslaat, heb je een record met lcname ="a" opgeslagen, en de volgende keer dat je probeert een entiteit met de naam "a" op te slaan, zal de bewerking mislukken vanwege de beperking op lcname. De wijziging is volledig transparant aan iedereen die een entiteit uit de database ophaalt, aangezien lcname privé is en er geen getter voor is, terwijl de oorspronkelijke getName de oorspronkelijke naam retourneert zoals deze oorspronkelijk is opgegeven door de client die deze heeft gemaakt.