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

fab*_*474 3 grails grails-orm database-schema grails-constraints

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

考虑以下课程:

class Article {
  String text

  static hasMany = [tags: String]

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

}
Run Code Online (Sandbox Code Playgroud)

我希望在我的约束中定义的每篇文章都有一个唯一的标记名称,但我不能使用上面的语法.显然,我需要在DB模式中使用以下内容:

create table article_tags (article_id bigint, tags_string varchar(255), unique (article_id , tags_string))
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

PS:我也坚持设置标签最小和最大尺寸的约束

rob*_*ert 5

仅供参考,您还可以在域类中使用自定义验证器:

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

在数据库级别,您可以通过在grails-app/conf/hibernate/hibernate.cfg.xml中包含以下代码来自定义DDL生成:

<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>
Run Code Online (Sandbox Code Playgroud)