grails - 如何在数据库级别为一对多关联设置唯一性?

标签 grails grails-orm database-schema grails-constraints

我的问题很简单,但我找不到任何 GORM 语法。

考虑以下类:

class Article {
  String text

  static hasMany = [tags: String]

  static constraints= {
    tags(unique: true) //NOT WORKING
  }

}

我想在我的约束中定义每篇文章一个唯一的标签名称,但我无法使用上述语法。 显然我需要在 DB 模式中类似:

create table article_tags (article_id bigint, tags_string varchar(255), unique (article_id , tags_string))

我该怎么做?

PS:我也被困在设置标签最小和最大尺寸的限制

最佳答案

仅供引用,您也可以使用 custom validator在域类中:

    static constraints = {
    tags(validator: { 
        def valid = tags == tags.unique()
        if (!valid) errors.rejectValue(
            "tags", "i18n.message.code", "default message")
        return valid
    })

在数据库级别,您可以customize DDL generation通过在 grails-app/conf/hibernate/hibernate.cfg.xml 中添加以下代码:

<hibernate-mapping>
    <database-object>
        <create>
        ALTER TABLE article_tags
        ADD CONSTRAINT article_tags_unique_constraint 
        UNIQUE(article_id, tags_string);
    </create>
        <drop>
        ALTER TABLE article_tags 
        DROP CONSTRAINT article_tags_unique_constraint;
    </drop>
    </database-object>
</hibernate-mapping>

关于grails - 如何在数据库级别为一对多关联设置唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4041939/

相关文章:

grails - Null springSecurityService 导致 encodePassword 在 Grails 2.0.1 中失败

用于 FieldErrors 的 Grails JSON 编码器

node.js - Grails 作为单个应用程序或不同的后端和前端应用程序

database - 在 Vertica 中,您是否应该将字符串分解到它们自己的逻辑表中?

mysql - Multi-Tenancy MySQL 数据库中数据的虚拟隔离

hibernate - 为什么域类静态方法不能从 grails "service"内部工作?

oracle - 带有 Oracle 厚 OCI 驱动程序的 Grails 使用错误的用户向 Oracle 进行身份验证

mysql - 俄语字符被存储为 ????在 mysql 中,在 grails 应用程序中

database-design - 电子邮件滴灌应用程序的数据库模式?

grails - grailsApplication.config.grails.binRange 处的代码失败。任何人都可以解决这个问题?