Почему при создании двух объектов, ссылающихся друг на друга, почему первый ObjectId изменяется после сохранения в MongoDB? - PullRequest
0 голосов
/ 28 ноября 2011

Я использую 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» ссылается на «Dummy», сохраняя ObjectId вручную по техническим причинам.

Вот мой интеграционный тест, создающий два объекта.

@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. Иногда пустышка ссылается на ничто, а пустышка2 ссылается на недопустимый идентификатор объекта.Пустышка:

    {
        "_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 с ObjectId ("4ecfa039941836a18fe88b22")?Это потеряно?Почему?

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

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

После проведенных дополнительных тестов и обращения к журналу MongoDB. Я обнаружил, что поскольку генерируемые интеграционные тесты Spring Roo включают некоторые тесты, которые обрабатывают случайный документ. Вот почему результаты моего интеграционного теста противоречивы.

Поэтому я бы отделил свои собственные тесты от сгенерированных тестов Roo, чтобы сохранить ожидаемые результаты на MongoDB.

0 голосов
/ 28 ноября 2011

как вы заметили плохие объекты?Было ли это после запроса коллекции?Кроме того, как вы вставляли объекты, выполняли ли вы большую массовую операцию?

Важно понимать, что по умолчанию записи с mongodb не подтверждаются.Может быть ошибка (дублирующий ключ или просто буферизация сокета), и ваше приложение не получит исключение или не получит задержку.Убедитесь, что вы используете безопасные записи (используя WriteConcern), затем повторите тестирование и посмотрите, нет ли каких-либо исключений.

...