我有一个对象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有着多对一的关系。
答案 0 :(得分:1)
您的简化版代码(Bar中的hasMany
除外)可以为我工作,没有任何FK异常。虽然如果我对父映射和子映射是正确的,我宁愿采用不同的方法来实现真正的一对一双向关系。
以下是我的设置,在没有FK约束异常的情况下工作正常。请注意,我在评论中还提到如果 Foo有一个Bar并且有一个Baz ,我将如何实现真正的一对一双向。
class Foo implements Serializable{
String someValue1
String someValue2
String whatever
//True one to one can be achieved by doing as below
//static hasOne = [bar: Bar, baz: Baz]
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 = {
//baz nullable:true, unique:true
}
}
class Bar {
String someOtherValue
//True one to one can be achieved by doing as below
//Below entry makes the relation bi-directional
//Foo foo
static mapping = {
id generator:'assigned', name:'someOtherValue'
//Optional, added for clarity
someOtherValue column: 'some_other_value'
}
}
class Baz implements Serializable{
String someValue1
String someValue2
String asdf
//True one to one can be achieved by doing as below
//Below entry makes the relation bi-directional
//Foo foo
static mapping = {
id composite: ['someValue1', 'someValue2']
//Optional, added for clarity
someValue1 column: 'some_value_1'
someValue2 column: 'some_value_2'
asdf column: 'asdf'
version false
}
}
class MyTests extends GroovyTestCase {
def fixtureLoader
void setUp() {
fixtureLoader.load {
myBar(Bar, someOtherValue:"shibby")
myFoo(Foo, someValue1:"test", someValue2:"test2",
whatever: "whatever", bar: myBar)
}
}
void testSomething() {
Foo.all.each{println it.properties}
Bar.all.each{println it.properties}
}
}
//Bootstrap Test in Dev mode
new Bar(someOtherValue: 'shibby').save()
new Foo(someValue1:"test", someValue2:"test2",
whatever: "whatever", bar: myBar).save(failOnError: true, flush: true)
备注
hasMany
关系。Baz
上的约束是可选的。logSql
显示了预期的DML。run-app
之后以开发模式BootStraped相同的测试数据。我能够使用dbconsole
。Bar
和Baz
]中创建FK,因此您在示例代码不会很好。hasMany
背后的基本原理,那么问题会更清楚。