Hibernate Annotations - Case Insensitive UniqueConstraint

时间:2010-10-27 09:30:38

标签: hibernate postgresql

我有一个用以下内容注释的实体:

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

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

2 个答案:

答案 0 :(得分:10)

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

  1. 添加一个新列,内部一个,称之为lcname(代表较低的名称)

    @NotEmpty
    @Column(nullable = false)
    private String lcname;
    
  2. 更改您设置为注释的约束以改为使用新字段:

    @Entity
    @Table(uniqueConstraints={@UniqueConstraint(columnNames={"lcname"})})
    public class Component extends Model {
        ...
    }
    
  3. 修改名称setter以将lcname设置为客户端提供的原始名称的小写

    public void setName(String name) {
        this.name = name;
        this.lcname = name.toLowerCase();
    }
    
  4. 那就是它。每次实体保持不变时,也会保存较低的套件名称。这样,如果你保存" A"你有一个lcname =" a"保存,下次您尝试保存名称为&#34的实体时,"由于lcname的约束,操作将失败 对于从数据库中获取实体的任何人来说,更改是完全透明的,因为lcname是私有的并且没有getter,而原始getName将返回创建它的客户端最初提供的原始名称。

答案 1 :(得分:6)

使用PostgreSQL,你确实会做这样的事情来实现你的要求:

CREATE UNIQUE INDEX My_Index on Component (lower(name));

但据我所知,无法使用注释来实现这一目标。

如果你想依赖Hibernate的hbm2ddl工具来生成架构并且仍然创建了索引,我能想到的唯一选择是利用import.sql功能。来自Rotterdam JBug and Hibernate's import.sql博文:

  

import.sql:轻松导入单元测试中的数据

     

Hibernate有一个简洁的小功能   这是严重缺乏记录和   未知。您可以执行SQL脚本   在SessionFactory创建期间   就在数据库架构之后   生成以新鲜的方式导入数据   数据库。您只需要添加一个文件   在类路径中命名为import.sql   root并设置create或   create-drop作为你的   hibernate.hbm2ddl.auto财产。

     

我用它来进行Hibernate Search   现在就开始行动了   查询章节。它初始化了我的   带有一组新数据的数据库   我的单元测试。 JBoss Seam也使用它   在各种例子中有很多。   import.sql是一个非常简单的功能   但是在时间上非常有用。记得   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');
     

有关此内容的更多信息   功能,检查Eyal's blogUpdated Location for dead link),他   写了一篇关于它的精彩小条目。   请记住,如果您想添加其他内容   数据库对象(索引,表和   所以),你也可以使用   auxiliary database objects   特征