【问题标题】:Hibernate Annotations - Case Insensitive UniqueConstraintHibernate Annotations - 不区分大小写的 UniqueConstraint
【发布时间】:2010-10-27 09:30:38
【问题描述】:

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

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

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

【问题讨论】:

  • 在 PostgreSQL 中是可能的,但我不知道你会如何告诉 Hibernate。在 SQL 中,您只需在列的小写或大写值上创建唯一索引。

标签: hibernate postgresql


【解决方案1】:

我建议从另一个角度解决这个问题:

  1. 添加一个新列,内部列,命名为 lcname(代表小写名称)

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

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

    public void setName(String name) {
        this.name = name;
        this.lcname = name.toLowerCase();
    }
    

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

【讨论】:

    【解决方案2】:

    使用 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 并设置 createcreate-drop 作为你的 hibernate.hbm2ddl.auto 属性。

    我将它用于休眠搜索 现在我已经开始行动了 查询章节。它初始化我的 具有一组新数据的数据库 我的单元测试。 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 功能。

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2017-09-29
      • 2011-01-14
      • 1970-01-01
      • 2012-06-17
      • 2012-12-01
      • 2013-03-06
      • 2020-02-18
      • 2012-01-06
      相关资源
      最近更新 更多