この問題を別の角度から攻撃することをお勧めします:
-
新しい列、内部列を追加し、それを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はプライベートであり、そのためのゲッターがないため、データベースからエンティティをフェッチするすべての人に、元のgetNameは、それを作成したクライアントによって最初に提供された元の名前を返します。