Eu sugeriria atacar esse problema de um ângulo diferente:
-
adicione uma nova coluna, interna, chame-a de lcname (significa nome em minúsculas)
@NotEmpty @Column(nullable = false) private String lcname;
-
altere a restrição definida como anotação para usar o novo campo:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
modifique o setter de nomes para também definir lcname com letras minúsculas do nome original fornecido pelo cliente
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
É isso. Toda vez que a entidade for persistida, também será salvo um nome em minúsculas. Dessa forma, se você salvar "A" terá um registro com lcname ="a" salvo, e da próxima vez que tentar salvar uma entidade com o nome "a" a operação falhará devido à restrição em lcnameA alteração é completamente transparente para qualquer pessoa que busque uma entidade do banco de dados, pois lcname é privado e não há getter para ele, enquanto o getName original retornará o nome original fornecido inicialmente pelo cliente que o criou.