如何在数据库级别为一对多关联设置唯一性? [英] How to set uniqueness at DB level for a one-to-many association?

查看:209
本文介绍了如何在数据库级别为一对多关联设置唯一性?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



请考虑以下课程:

  class Article {
字符串文本

static hasMany = [tags:String]

static constraints = {
标签(唯一:true)//不工作
}

}

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

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

我该怎么做?



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

仅供参考也可以在域名类中使用自定义验证器



<如果(!valid)错误,pre $ static constraints = {
tags(验证器:{
def valid = tags == tags.unique() rejectValue(
tags,i18n.message.code,default message)
return valid
})

在数据库级别,您可以自定义DDL代通过在 grails-app / conf / hibernate / hibernate.cfg.xml中使用以下代码

 <休眠映射> 
< 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>


My problem is simple but I could not find any GORM syntax for this.

Consider the following class:

class Article {
  String text

  static hasMany = [tags: String]

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

}

I want to have one unique tag name per article defined in my constraints but I cannot make it with the above syntax. Clearly I need in DB schema something like:

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

How can I do that?

PS: I am also stuck for setting constraints on tag minimum and maximum size

解决方案

FYI, you can also use a custom validator in domain classes:

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

At the database level, you can customize DDL generation by having the following code in 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>

这篇关于如何在数据库级别为一对多关联设置唯一性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆