2009-04-17 14 views
6

私は、Google App EngineとpersistオプションJDOを試しています。 一時オブジェクトを永続オブジェクトにマップすることが可能かどうかを知りたいですか?または一時オブジェクトを使用して永続オブジェクトを更新する何か?JDO - オブジェクトの更新

I私はオブジェクトを更新するために、次のコードを参照してくださいコーディング例:オブジェクトを:私はJPAのようなオブジェクト全体が行う更新できる場合

public void updateEmployeeTitle(User user, String newTitle) { 
PersistenceManager pm = PMF.get().getPersistenceManager(); 
try { 
    Employee e = pm.getObjectById(Employee.class, user.getEmail()); 
    if (titleChangeIsAuthorized(e, newTitle) { 
     e.setTitle(newTitle); 
    } else { 
     throw new UnauthorizedTitleChangeException(e, newTitle); 
    } 
} finally { 
    pm.close(); 
} 
} 

しかし、これは私が望むものではない、誰もが知っているん。更新();

は、だから私はこのような何かをしたいと思います:データストアでそれを検索する方法はありませんので、

public User update(User u) { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    User usr; 
    try { 
     usr = pm.getObjectById(User.class, u.getId()); 
     // copy transient object u to persist object usr. 
        // on update of usr all changes in object u are persistent. 

    } finally { 
     pm.close(); 
    } 

    return u; 
} 

答えて

2

「一時」オブジェクトは、「同一性」を持っていません。一時的なオブジェクトを使用するか、分離されたオブジェクトを使用するほうがよいかどうかを慎重に考えてください。 JPAは、「分離された」オブジェクトに相当するものを使用します。 JDOもそうすることができます。そしてpm.makePersistent(detachedObj)を呼び出します。

--Andy(DataNucleus

+0

オブジェクトが既にIDのセットを(ウェブフォームから移入するとき、以前のデータストアから読み取られ、または例えば場合)がある場合てmakePersistentは動作しません。 – pjesi

+1

オブジェクトがデータストアから読み込まれ、同じトランザクション内にある場合、makePersistentを呼び出す点がない場合、変更は自動的にデータストアに格納されます。 オブジェクトがデータストアから読み込まれ、デタッチされ、何かを変更した場合、makePersistentを呼び出すと、変更が付加されるため、確かに「動作」します。特定の問題が発生した場合は、Googleのappengineグループに報告することをお勧めします – DataNucleus