2014-03-25 42 views
1

我目前使用不區分大小寫的JPA唯一約束?

@Entity 
public class ... { 
... 
     /** 
     * @return the loginName 
     */ 
     @Column(unique=true) 
     public String getLoginName() { 
      return loginName; 
     } 

,但希望有一個不區分大小寫的約束,這樣當已經存在於數據庫中的登錄名「大寫的」登錄名「大寫」是不允許的。有什麼我可以使用,或者我必須創建存儲小寫版本在一個單獨的列中的骯髒的解決方法?

+0

您使用的是Whad數據庫? PostgreSQL或其他? – Hari

+0

我不想讓它依賴於數據庫。 – user1050755

回答

0

這不是JPA所涵蓋的東西,我甚至說沒有實現(例如Hibernate)。

你可以做的一件事是創建一個@PrePersist and @PreUpdate handler,它將填充另一個具有規格化(小寫)值的實體字段,並對其進行約束。

@Entity Foo { 
    private value; 
    @Column(unique = true) 
    private valueLowercased; 

    @PrePersist @PreUpdate private prepare(){ 
     this.valueLowercased = value == null ? null : value.toLowerCase(); 
    } 
} 

非JPA的辦法可能是有一個UNIQUE INDEX一個附加列myColumnLowercased,並且將其值設置爲LOWERCASE(new.myColumn)觸發。 (命名法可能因數據庫不同而不同。)

部分databases support "functional indexes"這是您可以通過表達式進行索引。

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));