Sugeriría atacar este problema desde un ángulo diferente:
-
agregue una nueva columna, una interna, llámela lcname (significa nombre en minúsculas)
@NotEmpty @Column(nullable = false) private String lcname;
-
cambie la restricción que estableció como anotación para usar el nuevo campo en su lugar:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
modifique el setter de nombre para establecer también lcname con una minúscula del nombre original proporcionado por el cliente
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Eso es todo. Cada vez que se persista la entidad, también se guardará un nombre en minúsculas. De esa manera, si guarda "A", tendrá un registro con lcname ="a" guardado, y la próxima vez que intente guardar una entidad con el nombre "a", la operación fallará debido a la restricción en lcname. El cambio es completamente transparente. a cualquier persona que obtenga una entidad de la base de datos, ya que lcname es privado y no hay un getter para él, mientras que getName original devolverá el nombre original proporcionado inicialmente por el cliente que lo creó.