2010-12-29 3 views
0

각 인스턴스에는 버전 형식의 개체 목록 (프로젝트와 버전 클래스 간의 소유 된 일대 다 관계)이있는 지속 가능한 클래스 Project가 있습니다.GAE 용 JDO : 쿼리에 의해 반환 된 개체 업데이트

내가 그들을 변경하고 저장하려고 쿼리와 데이터 저장소에서 여러 버전의 개체를 받고 있어요 :

PersistenceManager pm = PMF.get().getPersistenceManager(); 
Transaction tx = pm.currentTransaction(); 
try { 
    tx.begin(); 
    Query q = pm.newQuery(Version.class, "... filters here ..."); 
    q.declareParameters(" ... parameters here ..."); 
    List<Version> versions = (List<Version>)q.execute(... parameters here ...); 
    if (versions.size() > 0) { 
     for (Version version : versions) { 
      version.setOrder(... value here ...); 
     } 
     pm.makePersistentAll(versions); 
    } 
    tx.commit(); 
    return newVersion.toVersionInfo(); 
} finally { 
    pm.close(); 
} 

모두가 오류없이 실행, 쿼리는 실제로 속성이 런타임 버전 목록에 올바르게 설정되어, 여러 개체를 반환 개체 속성은 데이터 저장소에서 업데이트되지 않습니다. 개체 속성)을 (pm.close 전에 설정되어 있지만,이 행이 생략되면 아무것도 저장되지 않기 때문에

일반적으로, 지금까지의 내가 이해, 버전, 심지어

pm.makePersistentAll(versions); 
를 호출하지 않고 저장해야합니다, 게다가.

동시에, pm.getObjectById() 메소드로 Project 유형의 인스턴스 (많은 버전의 인스턴스를 소유) 인스턴스를 검색하고 루프의 모든 관련 버전 객체를 살펴보면 모든 변경 사항이 올바르게 저장됩니다 pm.makePersistent() 메서드를 호출하지 않고).

문제는 개체를 업데이트하는 것과 같은 문제가 무엇인가하는 것입니다. 왜 버전 객체 속성이 데이터 저장소에서 업데이트되지 않습니까?

JDO 나 GAE 문서에서 도움이되는 정보를 찾을 수 없습니다. 피터 Recore에서 DataNucleus에서 로그에 대한 조언과 공감에 대한

+1

아마도 setOrder를 호출하는 시점에서 로그를 보면 더 잘 이해할 수 있습니다. – DataNucleus

+0

당신을 도울 수는 없지만, 이런 종류의 디버깅이 확실히 내 머리를 찢어 지도록 만들었 기 때문에 동정심을 제공 할 수 있습니다 ... –

답변

0

감사합니다 :)

는 솔직히, 나는 내 질문에 몇 가지 중요한 점을 놓쳤다. 사실

,

Query q = pm.newQuery(Version.class, "... filters here ..."); 
tx.begin(); 

사이

나는 프로젝트 인스턴스를 검색하고, 및 버전 인스턴스 루프를 업데이트 한 후 좀 하나 개 더 버전의 객체를 지속하고있다.

그래서 실제로 몇 가지 버전 목록을 두 번 가져 와서 로그의 커밋 순서에 따라 Project 인스턴스가 두 번 저장되었습니다. 두 x 째 저장 조작은 첫 x ​​째 저장 조작을 겹쳐 9니다.

작업 순서가 변경되어 예상되는 동작이 발생했습니다.

+0

그냥 명확히하기 위해 문제는 코드에 의해 야기되었다고 말하고 있습니까? 코드 스 니펫에 표시됩니까? –

+0

예. 트랜잭션이 시작된 직후에 프로젝트에 pm.getObjectById()가 호출되었고 트랜잭션 커밋 전에 pm.makePersistent()가 Version 인스턴스를 호출했습니다. – Kel

관련 문제