2010-02-26 4 views
1

안녕하세요 db4o입니다.db4o 개체 업데이트 딜레마

내가 염두에 질문이 있습니다 : 객체가 DAL에서 검색 할 때, 어쩌면 비즈니스 층에 업데이트됩니다, 우리는 그것이 내가 원래 어느 쪽이 찾을 수있는 방법 업데이트에 관해서 이렇게하면 원래 재산의 손실 업데이트 할 데이터베이스의 객체?

objectContainer.get().ext().getByID(id); 

를 또는 UUID를 통해 :

답변

2

'개체'에 대해보다 정확하게 설명해야합니다. 당신은 개체 인스턴스의 속성을 수정하는 경우, 단순히 업데이트를 수행 다시 저장 :

MyClass someInstance = ObjectContainer.Query<MyClass>().FirstOrDefault(); 
someInstance.Name = "NewName"; 
someInstance.PhoneNumber = 12132434; 
ObjectContainer.Store(someInstance); // This is the update call 

를 [이것은 단지 의사 코드] 그래서

당신이 각 다른 개체와 일치 할 필요가 없습니다 RDBMS를 사용할 때해야합니다.

그러나 다른 컨테이너는 ID 필드가 없으므로 다른 컨테이너가이 개체가 동일한 인스턴스인지 모르기 때문에 ObjectContainer의 다른 인스턴스를 사용하지 않아야합니다.

대부분의 워크 플로에서 응용 프로그램 아키텍처가 도움이되므로 실제로는 IObjectContainer 한 개만 있어야합니다. 시간대가 너무 길 때만 (예 : 개체에 대한 참조를 다른 데이터베이스에 저장하고 어떻게 든 처리해야하는 경우) UUID를 사용합니다. 이미 지적했듯이, ID를 다른 곳에 저장해야하므로 아키텍처가 복잡해집니다.

하지만 새 개체를 만들고 기존 개체를 '덮어 쓰는'경우 다른 개체를 참조하기 때문에 작업이 다소 복잡해집니다. 그러나, 이것은 약간의 병리학적인 경우이며, 전형적으로 도메인 모델 자체 내에서 처리되어야한다. 객체 데이터를 한 객체에서 다른 객체로 복사합니다.

+0

그래서, 응용 프로그램을 실행하는 동안 데이터베이스를 열어 두는 것이 좋습니다. 그래서 내가 ObjectContainer의 인스턴스를 하나만 가질 수 있습니까? – Benny

+0

본질적으로 그렇습니다. 개념은 ObjectContainer가 객체 ID를 유지할 책임이 있다는 것입니다. 따라서 컨테이너를 닫을 때마다 해당 정보가 손실됩니다. 일반적인 RDBMS와는 달리, 가능한 빨리 연결을 열고 닫는 db4o 컨테이너는 잠재적으로 데이터 모델에 대한 액세스가 필요할 때마다 열려 있어야합니다. 웹 응용 프로그램에서 예를 들어 요청 시작시 연결을 열고 요청이 완료되면 연결을 닫습니다. 데스크탑 응용 프로그램에서는 인스턴스를 더 오랫동안 열어 둘 수 있습니다. 그것이 참고를 유지한다는 것을주의하십시오! – mnemosyn

2

당신의 ID를 통해 개체를로드한다

objectContainer.get().ext().getByUUID(uuId); 

See the docs를 후자의 하나. 설명은 대답 here 또는 here 문서를 참조하십시오. 짧게는 장기간 참조 할 때만 사용하십시오.

+0

그러면 DB 어딘가에서 검색 한 객체의 ID를 저장해야합니까? – Benny

+0

음, 네. 나는 당신이 사용하고있는 아키텍쳐를 모른다. 그러나 일반적으로 ID는 전체 객체 대신에 세션에 저장되고 객체는 다음 요청시 ID에서 다시로드된다. 하지만 mnemosyn은 이미 지적했듯이, 동일한 객체를 참조하는 동안 ID를 필요로하지 않습니다 (db4o가 업데이트를 수행합니다). 어쩌면 당신은 당신에게 문제가있는 코드를 줄 수 있습니다. – Karussell

+0

mnemosyn이 지적한 것처럼 객체 인스턴스와 ObjectContainer 인스턴스가 동일하면 객체 업데이트가 쉽습니다. 따라서 내 응용 프로그램의 수명 동안 데이터베이스를 열어 두어야합니까? 그러면 우리가 RDBMS, coz를 사용하는 방식과 매우 다릅니다. RDBMS는 일반적으로 CRUD를 위해 데이터베이스를 열고 바로 닫습니다. – Benny