Hibernate注释-不区分大小写的UniqueConstraint

Hibernate注释-不区分大小写的UniqueConstraint,hibernate,postgresql,Hibernate,Postgresql,我有一个实体,其注释如下: @Entity @Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})}) public class Component extends Model { ... } 是否可以使UniqueConstraint不区分大小写?我们使用的是PostgreSQL。对于PostgreSQL,您确实可以这样做来实现您的需求: CREATE UNIQUE INDEX My_Index on Com

我有一个实体,其注释如下:

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Component extends Model {
    ...
}

是否可以使UniqueConstraint不区分大小写?我们使用的是PostgreSQL。

对于PostgreSQL,您确实可以这样做来实现您的需求:

CREATE UNIQUE INDEX My_Index on Component (lower(name));
但据我所知,使用注释无法实现这一点

如果您想依靠Hibernate的
hbm2ddl
工具来生成模式,并且仍然创建索引,那么我能想到的唯一选项是利用
import.sql
功能。从博客帖子:

import.sql:在单元测试中轻松导入数据 Hibernate有一个简洁的小特性 这在很大程度上缺乏文件记录和 不知道。您可以执行SQL脚本 在
会话工厂
创建期间 就在数据库模式之后 以新格式导入数据的生成 数据库您只需要添加一个文件 在类路径中命名为
import.sql
根目录并设置
create
create drop
作为您的
hibernate.hbm2ddl.auto
属性

我使用它来进行中的Hibernate搜索 现在我已经开始行动了 查询章节。它初始化了我的 具有一组新数据的数据库,用于 我的单元测试。JBossSeam也使用它 在各种各样的例子中有很多。
import.sql
是一个非常简单的功能 但这在当时是非常有用的。记得 SQL可能依赖于 你的数据库(啊,可移植性!)

有关此的详细信息,请参见 特征,检查(),他 写了一篇很好的小文章。 记住,如果你想添加额外的 数据库对象(索引、表和 依此类推),您还可以使用 特色


我建议从不同的角度来解决这个问题:

  • 添加一个新列,内部列,称之为lcname(代表小写名称)

    @NotEmpty
    @列(nullable=false)
    私有字符串名称;
    
  • 将设置为注释的约束更改为使用新字段:

    @实体
    @表(uniqueConstraints={@UniqueConstraint(columnNames={“lcname”})})
    公共类组件扩展模型{
    ...
    }
    
  • 修改名称设置器,以将lcname设置为客户端提供的原始名称的小写形式

    public void集合名(字符串名){
    this.name=名称;
    this.lcname=name.toLowerCase();
    }
    
  • 就这样。每次实体被持久化时,也会保存一个小写的名称。这样,如果您保存“A”,您将保存一条lcname=“A”的记录,并且下次尝试保存名为“A”的实体时,由于lcname上的约束,操作将失败
    更改对从数据库中获取实体的任何人都是完全透明的,因为lcname是私有的,并且没有getter,而原始getName将返回最初由创建它的客户端提供的原始名称。

    在PostgreSQL中是可能的,但我不知道您如何告诉Hibernate。在SQL中,您只需在列的小写或大写值上创建一个唯一索引。
    #import.sql file
    delete from PRODUCTS
    insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
    insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');