2010-12-21 6 views
0

私は小さなWebアプリケーションを作成してJDO(と同時にGAEとSpringの複雑さ)を学びたいと思っていますし、更新されたドメインオブジェクトをデータベースに保存するのに問題があります。私はまず、DBからエンティティを取得し、デタッチしてユーザーに表示し、変更を許可できるようにします。ユーザーが変更を加えてアプリケーションにフォームをポストしたら、もう一度DBからエンティティを取得してプロパティを更新し、pm.makePersistent()を呼び出します。次のように略しコードは次のとおりです。JDOはこの切り離されたオブジェクトがきれいだと思うのはなぜですか?

ユーザードメインオブジェクト:

@PersistenceCapable(detachable="true") 
public class User extends BaseEntity { 
    @Persistent 
    private String firstName = ""; 
    @Persistent 
    private String middleInitial = ""; 
    @Persistent 
    private String lastName = ""; 
} 

DAO読む方法:

public User read(Key key) throws DataException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    User pkg, detached = null; 
    try { 
     pkg = (User) pm.getObjectById(User.class, key); 
     detached = pm.detachCopy(pkg); 
     detached.setIsAlreadyInDB(true); 
    } 
    catch (Exception e) {   
     throw new DataException("An error occured trying to read the User object. Details:\n" + e.getMessage()); 
    } 
    finally { 
     pm.close(); 
    } 
    return detached; 
} 

DAO更新方法:今

private void update(User pkg) throws DataException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    Transaction tx = pm.currentTransaction(); 

    try { 
     tx.begin();   
     pm.makePersistent(pkg); 
     tx.commit(); 
    } 
    finally { 
     if (tx.isActive()) tx.rollback(); 
     pm.close(); 
    } 
} 

私はダウンに入りますupdateメソッドを使って、私は自分のreadから同じオブジェクトを使って012を調べて作業していることを自分自身に証明しました、ドメインオブジェクトのセッターメソッドを使用して値を変更しました。変更された値をコンソールに出力して完了したことを確認しました.はまだfalseを返します。データベース。 私は何が欠けているか、または私が間違った角度からこれに近づいていると思っていますか? JDOの初心者を助けてくれてありがとう!

答えて

1

JDOHelper.isDirtyは管理対象オブジェクトです。切り離されたオブジェクトは管理されません。 DataNucleusは、ロジックがインプリメンテーション固有であるため、デタッチしている間にダーティなフィールドを取得するヘルパーメソッドを提供します。 String [] dirtyFieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields(obj、pm);

+0

これを指摘してくれてありがとう、ドキュメンテーションを読むときに私はそれを逃していた。なぜなら、切り離されたオブジェクトでデータが変更されたことを認識しないため、変更を保持しない理由が不思議です。 – Joshua

+0

なぜあなたはログを持っているのですか – DataNucleus

関連する問題