不区分大小写的 JPA 唯一约束?

use*_*755 4 jpa constraints

我目前正在使用

@Entity
public class ... {

    /**
     * @return the loginName
     */
    @Column(unique=true)
    public String getLoginName() {
        return loginName;
    }
Run Code Online (Sandbox Code Playgroud)

但喜欢有一个不区分大小写的约束,这样当数据库中已经存在登录名“大写”时,不允许使用登录名“大写”。有什么我可以使用的,或者我是否必须创建将小写版本存储在单独的列中的肮脏的解决方法?

Ond*_*žka 5

这不是 JPA 所涵盖的内容,我想说甚至没有实现(例如 Hibernate)。

您可以做的一件事是创建一个@PrePersistand@PreUpdate处理程序,它将用规范化(小写)值填充另一个(附加)实体字段,并对其进行约束。

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

    @PrePersist @PreUpdate private prepare(){
        this.valueLowercased = value == null ? null : value.toLowerCase();
    }
}
Run Code Online (Sandbox Code Playgroud)

非 JPA 方法可能是拥有一个myColumnLowercased带有UNIQUE INDEX和 触发器的附加列,该触发器会将值设置为LOWERCASE(new.myColumn)。(不同数据库的命名法可能有所不同。)

一些数据库支持“功能索引”,即您可以通过表达式进行索引。

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
Run Code Online (Sandbox Code Playgroud)

  • 我想知道这是否至少在某些情况下会破坏 Foo 类上的 equals() 和 hashcode() 契约?如果要求值不区分大小写唯一,也许 equals 和 hc 需要反映这一点,在这种情况下,填充小写值 prepersist 和 preupdate 为时已晚(cf id)? (2认同)