Jag skulle föreslå att du attackerar det här problemet från en annan vinkel:
-
lägg till en ny kolumn, intern en, kalla den lcname (står för namn med små bokstäver)
@NotEmpty @Column(nullable = false) private String lcname;
-
ändra begränsningen du anger som anteckning för att använda det nya fältet istället :
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
ändra namninställaren för att även ställa in lcname med små bokstäver av det ursprungliga namnet som tillhandahålls av klienten
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Det är allt. Varje gång entiteten behålls sparas även ett namn med gemener. På det sättet om du sparar "A" kommer du att ha en post med lcname ="a" sparad, och nästa gång du försöker spara en enhet med namnet "a" kommer operationen att misslyckas på grund av begränsningen på lcname. Ändringen är helt transparent till alla som hämtar en entitet från databasen eftersom lcname är privat och det inte finns någon getter för det, medan det ursprungliga getName kommer att returnera det ursprungliga namnet som ursprungligen gavs av klienten som skapade det.