2011-11-28 2 views
0

나는 spring roo를 사용하고 있습니다. 그러나 이것이 Spring Roo 문제가 아니라 MongoDB 문제라고 생각합니다.동시에 두 개체를 참조 할 때 MongoDB에 저장된 후 첫 번째 ObjectId가 변경된 이유는 무엇입니까?

두 클래스 (문서)가 서로 참조됩니다.

public class Dummy { 
    private String dummyString; 

    @DBRef 
    private Dummy2 dummy2; 
} 

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

'더미'는 참조로 '더미 2'를 나타냅니다.
'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") 
        } 
    } 
    


    Dummy2 :

    { 
        "_id": ObjectId("4ecfa5429418d09a94f1c8af"), 
        "_class": "com.mytest.model.Dummy2", 
        "dummyString": "dummyString_0", 
        "dummyId": ObjectId("4ecfa5429418d09a94f1c8ae") 
    } 
    
  2. 때로는 더미 아무것도하고 dummy2을 말한다는 ObjectId가 무효을 말한다.

    더미 :

    { 
        "_id": ObjectId("4ecfa039941836a18fe88b24"), 
        "_class": "com.mytest.model.Dummy", 
        "dummyString": "dummyString_2147483647" 
    } 
    


    Dummy2 :

    { 
        "_id": ObjectId("4ecfa039941836a18fe88b23"), 
        "_class": "com.mytest.model.Dummy2", 
        "dummyString": "dummyString_0", 
        "dummyId": ObjectId("4ecfa039941836a18fe88b22") 
    } 
    

후자의 결과가 발생 될 수있는 이유가 궁금합니다. Dummy2가 언급 한 것과 같은 것이 아니라 새로 만든 것처럼 보입니다. 그러나 ObjectId ("4ecfa039941836a18fe88b22")가있는 더미는 어디 있습니까? 잃어 버렸습니까? 왜?

루 : 1.2.0.M1 [레브 1fa252f]
MongoDB를 :

답변

0

더 많은 테스트를 수행 한 후 MongoDB 로그를 참조하십시오. Spring Roo의 생성 된 통합 테스트에는 처리 할 임의의 문서를 얻는 몇 가지 테스트가 포함되어 있기 때문에이를 발견했습니다. 그래서 내 통합 테스트 결과에 일관성이 없습니다.

그래서 나는 MongoDB에서 예상되는 결과를 보존하기 위해 Roo의 생성 된 테스트와 내 테스트를 분리했다.

0

2.0.1 어떻게 당신은 잘못된 개체를 발견 했습니까? 나중에 컬렉션을 쿼리 했나요? 또한 개체를 어떻게 삽입 했습니까? 대규모 대량 작업을 수행 했습니까?

기본적으로 mongodb를 사용한 쓰기는 인식되지 않습니다. 오류 (dup 키 또는 소켓 버퍼링)가있을 수 있으며 응용 프로그램에서 예외가 발생하지 않거나 지연된 응용 프로그램을 얻을 수 없습니다. SAFE 쓰기 (WriteConcern 사용)를 사용했는지 확인한 다음 다시 테스트하고 예외가 없는지 지켜보십시오.

+0

나는 RockMongo를 사용하여 수집 결과를 확인합니다. 삽입에 관해서는 질문과 마찬가지로 testDummyWithDummy2()입니다. 단 3 개의 쿼리 명령. 문서와 ObjectId가 실제로 서버로 업데이트되기 전에 클라이언트 측에서 완전히 처리된다는 점이 걱정됩니다. 그러나 격리 된 환경에서 실행되는 명령은 3 개뿐이므로 dup 키는 불가능합니다. 소켓 버퍼링 문제는 localhost에서 발생하기 때문에 거의 발생하지 않습니다. 나는 당신이주의 한대로 안전한 쓰기를 시도 할 것이다. 또한 Spring Roo, MongoDB 드라이버 또는 MongoDB인지 여부를 확인하기 위해 몇 가지 실험을 할 것입니다. – PaePae

+0

통합 테스트에 대한 자신의 잘못이라고 알게되었습니다. 나는 내 자신의 질문에 또 다른 대답을 올렸다. 어쨌든 고맙습니다 :-) – PaePae