0

我正在使用 spring roo,但我认为这不是 spring roo 问题,而是 MongoDB 问题。

我有两个相互引用的类(文档)。

public class Dummy {
    private String dummyString;

    @DBRef
    private Dummy2 dummy2;
}

public class Dummy2 {
    private String dummyString;
    private ObjectId dummyId;
}

'Dummy' 通过引用指代 'Dummy2'。
由于技术原因,“Dummy2”通过手动存储 ObjectId 来指代“Dummy”。

这是我创建两个对象的集成测试。

@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);
}

我发现结果不一致。
目前有两种情况。

  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 所指的 Dummy 不一样,看起来像新创建的 Dummy。但是带有 ObjectId("4ecfa039941836a18fe88b22") 的 Dummy 在哪里?它丢失了吗?为什么?

Roo:1.2.0.M1 [rev 1fa252f]
MongoDB:2.0.1

4

2 回答 2

0

你是怎么注意到坏物体的?是通过事后查询集合吗?另外,您是如何插入对象的,您是否进行了大批量操作?

重要的是要了解默认情况下不确认使用 mongodb 的写入。可能存在错误(复制键,或只是套接字缓冲),您的应用程序不会得到异常或延迟。确保使用 SAFE 写入(使用 WriteConcern),然后再次测试并注意任何异常。

于 2011-11-28T18:20:17.653 回答
0

在进行了更多测试并查阅了 MongoDB 日志之后。我发现这是因为 Spring Roo 生成的集成测试包括一些让随机文档进行处理的测试。这就是为什么我的集成测试结果不一致的原因。

因此,我会将自己的测试与 Roo 生成的测试分开,以保留 MongoDB 上的预期结果。

于 2011-11-29T07:52:40.270 回答