Tôi khuyên bạn nên tấn công vấn đề này từ một góc độ khác:
-
thêm một cột mới, một cột bên trong, gọi nó là lcname (viết tắt của tên viết thường)
@NotEmpty @Column(nullable = false) private String lcname;
-
thay đổi ràng buộc bạn đặt làm chú thích để sử dụng trường mới thay thế:
@Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})}) public class Component extends Model { ... }
-
sửa đổi bộ đặt tên để cũng đặt lcname bằng chữ thường của tên gốc do khách hàng cung cấp
public void setName(String name) { this.name = name; this.lcname = name.toLowerCase(); }
Đó là nó. Mỗi khi thực thể sẽ được duy trì, thì một tên lồng ghép thấp hơn cũng sẽ được lưu. Bằng cách đó nếu bạn lưu "A", bạn sẽ có một bản ghi với lcname ="a" được lưu và lần tiếp theo bạn cố gắng lưu một thực thể với tên "a", thao tác sẽ không thành công do ràng buộc trên lcname. Thay đổi hoàn toàn minh bạch cho bất kỳ ai tìm nạp một thực thể từ cơ sở dữ liệu vì lcname là riêng tư và không có getter cho nó, trong khi getName ban đầu sẽ trả về tên ban đầu như được cung cấp ban đầu bởi khách hàng đã tạo nó.