簡體   English   中英

JDO為什么認為這個分離的對象是干凈的?

[英]Why does JDO think this detached object is clean?

我正在嘗試通過創建一個小型Web應用程序來學習JDO(同時又了解其GAE和Spring的復雜性),並且在獲取更新的域對象以將其持久化回數據庫方面遇到困難。 最初,我從數據庫中獲取實體並將其分離,以便可以向用戶顯示該實體並允許他們進行更改。 一旦用戶進行了更改並將表單發布回應用程序,我將再次從數據庫(分離的)中獲取實體,更新其屬性,然后調用pm.makePersistent() 縮寫代碼如下:

用戶域對象:

@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方法時,我已經通過檢查其hashCode()來證明自己正在使用讀取的同一對象,我已經使用域對象的setter方法更改了值,甚至將更改后的值打印到控制台以確保已完成,並且JDOHelper.isDirty()仍然返回false,因此所有更改都不會持久化回到數據庫。 對我缺少的東西有什么想法,或者如果我從錯誤的角度來解決這個問題? 感謝您幫助JDO初學者!

JDOHelper.isDirty用於托管對象。 分離的對象不受管理。 DataNucleus提供了自己的幫助器方法,以便在分離時獲取臟字段,因為邏輯是特定於實現的String [] dirtyFieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields(obj,pm);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM