0

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 つの状況があります。

  1. 正しく動作します。期待どおりにお互いを参照します。

    ダミー:

    {
        "_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") 
    }
    
  2. 場合によっては、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

4

2 に答える 2

0

どのようにして悪いオブジェクトに気づきましたか? 後でコレクションにクエリを実行したのですか?また、オブジェクトをどのように挿入したか、大規模な一括操作を行いましたか?

デフォルトでは、mongodb による書き込みは認識されないことを理解することが重要です。エラー (dup キー、または単にソケット バッファリング) が発生する可能性があり、アプリケーションは例外を取得したり、遅延したものを取得したりしません。SAFE 書き込み (WriteConcern を使用) を使用していることを確認してから、再度テストして例外を監視します。

于 2011-11-28T18:20:17.653 に答える
0

さらにテストを行った後、MongoDB ログを調べました。これは、Spring Roo で生成された統合テストに、ランダムなドキュメントを処理するテストが含まれているためです。そのため、私の統合テストの結果は矛盾しています。

そのため、MongoDB で期待される結果を保持するために、Roo が生成したテストから独自のテストを分離します。

于 2011-11-29T07:52:40.270 に答える