Bar と双方向の 1 対 1 の関係を持つオブジェクト Foo と、Baz との別のオブジェクトがあります。Foo で .load を実行しようとして Bar のみを指定すると、Baz がないという不平を言う参照整合性の例外が発生します。
これは本当にそうであるべきですか?実際の環境では、データベース内に一致する Baz オブジェクトが存在しない可能性はありませんか?
フィクスチャのロード クロージャで baz:null を手動で設定しようとしましたが、それでも同じ結果が得られます。ちなみに、プロパティ (単純な文字列など) のみを設定すると、すべて正常に動作します。人間関係を築き始めたときだけです。
これは Grails 2.2.4、Fixtures 1.2 で、build-test-data プラグインがインストールされていない場合です。
EDIT : Baz が null 可能で一意であることを指定する制約があります。くすくす笑うために、blank
制約も追加しようとしましたが、うまくいきませんでした。
static constraints = {
baz nullable:true, unique: true, blank: true
}
EDIT 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) REFERENCES MYSCHEMA.BAZ(SOME_VALUE_1, SOME_VALUE_2)"; SQL ステートメント: MYSCHEMA.foo (whatever, some_other_value, some_value_2, some_value_1) 値 (?, ?, ?, ?, ?, ?, ?, ?) に挿入します [23506-164]
編集:申し訳ありませんが、私は以前に言い間違えました。Bar は Foo と多対 1 の関係にあります。