如何在数据库级别为一对多关联设置唯一性? [英] How to set uniqueness at DB level for a one-to-many association?
问题描述
我的问题很简单,但我找不到任何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屋!