【发布时间】:2013-08-10 14:19:30
【问题描述】:
我有一个对象 Foo,它与 Bar 和另一个与 Baz 具有双向一对一关系。当我尝试使用 Foo 执行 .load 并只给它一个 Bar 时,我收到引用完整性异常,抱怨没有 Baz。
真的应该这样吗?在现实世界的环境中,数据库中不可能没有任何匹配的 Baz 对象吗?
我尝试在固定装置负载关闭中手动设置 baz:null,但我仍然得到同样的结果。附带说明一下,当我只设置属性(例如简单的字符串)时,一切正常。只有当我开始建立关系时。
这是使用 Grails 2.2.4、Fixtures 1.2 且未安装 build-test-data 插件。
编辑:我有将 Baz 指定为可为空且唯一的约束。只是为了咯咯笑,我也尝试添加 blank 约束,但没有运气。
static constraints = {
baz nullable:true, unique: true, blank: true
}
编辑 2:这是代码的简化版本:
class Foo {
String someValue1
String someValue2
String whatever
Bar bar
Baz baz
static mapping = {
id composite: ['someValue1', 'someValue2'], generator: 'assigned'
columns {
bar([:]) { column name: 'some_other_value' }
baz ([insertable:false, updateable: false]) {
column name: 'some_value_1'
column name: 'some_value_2'
}
}
version: false
static constraints = {
//there are no constraints for Bar
baz nullable:true, unique:true
}
}
class Bar {
String someOtherValue
static hasMany = [foos:Foo]
static mapping = {
id generator:'assigned', name:'someOtherValue'
}
}
class Baz {
String someValue1
String someValue2
String asdf
static mapping = {
id composite: ['some_value_1', 'some_value_2']
version false
}
}
class MyTest {
def fixtureLoader
@Before
void setup() {
fixureLoader.load {
myBar(Bar, someOtherValue:"shibby")
myFoo(Foo, someValue1:"test", someValue2:"test2", bar:myBar)
//i also tried this
//myFoo(Foo, someValue1:"test", someValue2:"test2", bar:myBar, baz:null)
}
}
}
这里是例外的一部分:
原因:org.h2.jdbc.JdbcBatchUpdateException:参照完整性 违反约束:“FK190E74B120F4F2BC:MYSCHEMA.FOO FOREIGN KEY(SOME_VALUE_1, SOME_VALUE_2) 参考 MYSCHEMA.BAZ(SOME_VALUE_1, SOME_VALUE_2)"; SQL 语句:插入到 MYSCHEMA.foo 中(无论如何, some_other_value, some_value_2, some_value_1) 值 (?, ?, ?, ?, ?, ?, ?, ?) [23506-164]
编辑:抱歉,我之前说错了。 Bar 与 Foo 是多对一的关系。
【问题讨论】:
-
你能发布一个简单的失败例子吗?域类和装置会有所帮助
-
好的,我刚发了。
-
您将 Bar 上的 ID 设置为
generator:'assigned',但我没有看到任何地方设置了 id 值。这是否会导致 Bar 无法保存,从而在您保存 Foo 时会导致引用完整性约束? -
myBar(Bar, someOtherValue:"shibby") 不是设置id吗?
-
hasMany在 Bar w.r.t 中做了什么双向一对一关系?
标签: grails one-to-one fixtures referential-integrity bidirectional