不区分大小写的JPA唯一约束?
我目前正在使用不区分大小写的JPA唯一约束?,jpa,constraints,Jpa,Constraints,我目前正在使用 @Entity public class ... { /** * @return the loginName */ @Column(unique=true) public String getLoginName() { return loginName; } 但我希望有一个不区分大小写的约束,这样当数据库中已经有登录名“大写”时,就不允许使用登录名“大写”。有什么我可以使用的,或者我必须创建一个在单独的列中存
@Entity
public class ... {
/**
* @return the loginName
*/
@Column(unique=true)
public String getLoginName() {
return loginName;
}
但我希望有一个不区分大小写的约束,这样当数据库中已经有登录名“大写”时,就不允许使用登录名“大写”。有什么我可以使用的,或者我必须创建一个在单独的列中存储小写版本的肮脏的解决方法吗?这不是JPA所涵盖的内容,我甚至不能说是实现(例如Hibernate) 您可以做的一件事是创建一个将使用规范化(小写)值填充另一个(附加)实体字段的实体,并对其进行约束
@Entity Foo {
private value;
@Column(unique = true)
private valueLowercased;
@PrePersist @PreUpdate private prepare(){
this.valueLowercased = value == null ? null : value.toLowerCase();
}
}
非JPA的方法可能是增加一个列myColumnLowercased
,带有唯一索引
,以及一个将值设置为LOWERCASE(new.myColumn)
的触发器。(不同数据库的命名可能不同。)
有些是可以通过表达式索引的
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
你用的是什么数据库?PostgreSQL或其他?我不想让它依赖于数据库。我想知道这是否至少在某些情况下会破坏Foo类上的equals()和hashcode()契约?如果要求值不区分大小写是唯一的,那么可能等于,hc需要反映这一点,在这种情况下,将较小的大小写值填充到prepersist和preupdate就太晚了(cf id)?@Ian我想你的问题是混合层/概念。如果您创建的内存中对象没有针对数据库中存在的实体进行验证,那么它肯定会存在于内存中,并且具有非唯一ID。这在equals/hashCode中很难处理。如果我们只是讨论比较两个内存中的对象,那么取决于实体的定义“foo”的ID是否等于“foo”,在我看来,这是一个不同的方面。但是,是的,它是相关的。