Бих предложил да атакуваме този проблем от различен ъгъл:
-
добавете нова колона, вътрешна, наречете я lcname (означава име с малки букви)
@NotEmpty @Column(nullable = false) private String lcname;
-
променете ограничението, което сте задали като анотация, за да използвате вместо това новото поле:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
променете инструмента за настройка на име, за да зададете също lcname с малки букви на оригиналното име, предоставено от клиента
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Това е. Всеки път, когато обектът ще бъде запазен, ще бъде запазено и име с малки букви. По този начин, ако запишете „A“, ще имате запис с lcname =„a“ и следващия път, когато се опитате да запишете обект с име „a“, операцията ще се провали поради ограничението за lcname. Промяната е напълно прозрачна на всеки, който извлича обект от базата данни, тъй като lcname е лично и няма getter за него, докато оригиналното getName ще върне оригиналното име, както е предоставено първоначално от клиента, който го е създал.