spring roo を使用していますが、これは spring roo の問題ではなく、MongoDB の問題だと思います。
相互に参照する 2 つのクラス (ドキュメント) があります。
public class Dummy {
private String dummyString;
@DBRef
private Dummy2 dummy2;
}
public class Dummy2 {
private String dummyString;
private ObjectId dummyId;
}
「Dummy」は参照により「Dummy2」を指します。
'Dummy2' は、技術的な理由により ObjectId を手動で格納することによって 'Dummy' を参照します。
これは、2 つのオブジェクトを作成する統合テストです。
@Test
public void testDummyWithDummy2() {
DummyDataOnDemand dod = new DummyDataOnDemand();
Dummy dummy = dod.getNewTransientDummy(0);
dummyService.saveDummy(dummy);
Dummy2DataOnDemand dod2 = new Dummy2DataOnDemand();
Dummy2 dummy2 = dod2.getNewTransientDummy2(0);
dummy2.setDummyId(dummy.getId());
dummy2Service.saveDummy2(dummy2);
dummy.setDummy2(dummy2);
dummyService.updateDummy(dummy);
}
結果が矛盾していることがわかりました。
これまでに 2 つの状況があります。
正しく動作します。期待どおりにお互いを参照します。
ダミー:{ "_id": ObjectId("4ecfa5429418d09a94f1c8ae"), "_class": "com.mytest.model.Dummy", "dummyString": "dummyString_0", "dummy2": { "$ref": "dummy2", "$id": ObjectId("4ecfa5429418d09a94f1c8af") } }
ダミー2:{ "_id": ObjectId("4ecfa5429418d09a94f1c8af"), "_class": "com.mytest.model.Dummy2", "dummyString": "dummyString_0", "dummyId": ObjectId("4ecfa5429418d09a94f1c8ae") }
場合によっては、dummy が何も参照せず、dummy2 が無効な ObjectId を参照することがあります。
ダミー:{ "_id": ObjectId("4ecfa039941836a18fe88b24"), "_class": "com.mytest.model.Dummy", "dummyString": "dummyString_2147483647" }
ダミー2:{ "_id": ObjectId("4ecfa039941836a18fe88b23"), "_class": "com.mytest.model.Dummy2", "dummyString": "dummyString_0", "dummyId": ObjectId("4ecfa039941836a18fe88b22") }
なぜ後者の結果が生じたのだろうか。Dummy は Dummy2 が参照しているものとは異なり、新しく作成されたもののように見えます。しかし、ObjectId("4ecfa039941836a18fe88b22") のダミーはどこにあるのでしょうか? 紛失ですか?なんで?
Roo: 1.2.0.M1 [rev 1fa252f]
MongoDB: 2.0.1