Hibernate Annotations - Case Insensitive UniqueConstraint

Ric*_*ich 7 postgresql hibernate

我有一个带有以下注释的实体:

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
public class Component extends Model {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

kum*_*tix 10

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

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

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

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

    public void setName(String name) {
        this.name = name;
        this.lcname = name.toLowerCase();
    }
    
    Run Code Online (Sandbox Code Playgroud)

而已.每次实体保持不变时,也会保存较低的套件名称.这样,如果保存"A",你将保存一个lcname ="a"的记录,下次你尝试保存名为"a"的实体时,由于lcname的约束,操作将失败.对于从数据库中获取实体的任何人都是透明的,因为lcname是私有的并且没有getter,而原始的getName将返回创建它的客户端最初提供的原始名称.


Pas*_*ent 6

使用PostgreSQL,您确实可以执行以下操作来实现您的要求:

CREATE UNIQUE INDEX My_Index on Component (lower(name));
Run Code Online (Sandbox Code Playgroud)

但据我所知,使用注释无法实现这一点.

如果你想依靠Hibernate的hbm2ddl工具生成模式并且仍然创建了索引,那么我能想到的唯一选择是利用该import.sql功能.来自鹿特丹JBug和Hibernate的import.sql博客文章:

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

Hibernate有一个整洁的小功能,严重缺乏记录和未知.您可以在SessionFactory生成数据库模式之后立即执行SQL脚本,以在新数据库中导入数据.您只需要添加一个import.sql在类路径根目录中命名的文件,并将其设置为createcreate-drop作为您的 hibernate.hbm2ddl.auto属性.

现在我已经开始查询章节了,我将它用于Hibernate Search in Action.它使用一组新的数据为我的单元测试初始化​​我的数据库.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');
Run Code Online (Sandbox Code Playgroud)

有关此功能的更多信息,请查看Eyal的博客(更新位置的死链接),他写了一个很好的小条目.请记住,如果要添加其他数据库对象(索引,表等),还可以使用 辅助数据库对象 功能.