나는 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);
}
그 결과 불일치라는 것을 알게되었습니다.
지금까지 두 가지 상황이 있습니다.
올바르게 작동합니다. 그들은 예상대로 서로를 참조합니다.
더미 :{ "_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") }
때로는 더미 아무것도하고 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를 :
나는 RockMongo를 사용하여 수집 결과를 확인합니다. 삽입에 관해서는 질문과 마찬가지로 testDummyWithDummy2()입니다. 단 3 개의 쿼리 명령. 문서와 ObjectId가 실제로 서버로 업데이트되기 전에 클라이언트 측에서 완전히 처리된다는 점이 걱정됩니다. 그러나 격리 된 환경에서 실행되는 명령은 3 개뿐이므로 dup 키는 불가능합니다. 소켓 버퍼링 문제는 localhost에서 발생하기 때문에 거의 발생하지 않습니다. 나는 당신이주의 한대로 안전한 쓰기를 시도 할 것이다. 또한 Spring Roo, MongoDB 드라이버 또는 MongoDB인지 여부를 확인하기 위해 몇 가지 실험을 할 것입니다. – PaePae
통합 테스트에 대한 자신의 잘못이라고 알게되었습니다. 나는 내 자신의 질문에 또 다른 대답을 올렸다. 어쨌든 고맙습니다 :-) – PaePae