具有空组件的复合 id 的唯一性
我在使用独特的约束时遇到了问题。 允许以下组合
A.name B.name
foo NULL
foo bar
foo bar1
foo1 bar
不可能创建具有相同名称的新 A,除非它具有不同的 B。 有了下面的约束,就可以创建
A.name B.name
foo NULL
foo NULL
因为 NULL 似乎对唯一性没有影响。
有任何提示如何解决这个问题吗?
class A {
String name
static belongsTo = [b:B]
static constraints = {
name(unique:'b')
b(nullable:true)
}
}
class B {
String name
static hasMany = [as:A]
name(unique:true)
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在数据库结构中,您可以将列设置为 NOT NULL DEFAULT 0 或类似的值,然后像对待 NULL 一样对待零吗?由于该列用于名称,因此值中可能没有数字,对吧?
In the database structure, could you set the columns to
NOT NULL DEFAULT 0
or similar, and then treat the zeros the same as you otherwise would the NULLs? Since the column is for names, there's likely to be no digits in the values anyway right?我不完全确定,但我认为这会起作用:
查看唯一约束的代码,这似乎是可行的。该约束绝对允许您传入一个列表来比较唯一性。它将其称为 uniquenessGroup。然后,在验证时,它会迭代此列表。从第 137 行开始看一下: http://www.docjar.com/html/api/org/codehaus/groovy/grails/orm/hibernate/validation/UniqueConstraint.java.html
代码如下所示
:取决于 GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue 调用是否将检索同一类中的属性。从名字来看,它似乎应该是这样。
我很想知道它是否适合你。
I'm not entirely sure, but I think this will work:
Looking at the code for the unique constraint, it seems feasible. The constraint definitely lets you pass in a list of things to compare the uniqueness to. It calls this the uniquenessGroup. Then, when validating, it iterates over this list. Take a look starting at line 137 here: http://www.docjar.com/html/api/org/codehaus/groovy/grails/orm/hibernate/validation/UniqueConstraint.java.html
The code looks like this:
So it depends on whether the GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue call will retrieve a property in the same class. Which based on the name it seems like it should.
I'm curious to know if it works for you.