Java 为什么JDO认为这个分离的对象是干净的?

Java 为什么JDO认为这个分离的对象是干净的?,java,google-cloud-datastore,jdo,Java,Google Cloud Datastore,Jdo,我试图通过创建一个小型web应用程序来学习JDO(同时学习其GAE和Spring的复杂性),但在获取更新的域对象以将其持久化回数据库时遇到了困难。最初,我从数据库中获取实体并将其分离,以便向用户显示它并允许他们更改它。一旦用户进行了更改并将表单发布回应用程序,我将再次从数据库中获取实体(分离),更新其属性,然后调用pm.makePersistent()。缩写代码如下: 用户域对象: @PersistenceCapable(detachable="true") public class User

我试图通过创建一个小型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)

感谢您指出这一点,我在阅读文档时错过了这一点。仍然想知道为什么它不能识别分离对象中的数据已经更改,因此不能持久化这些更改。这就是为什么你有一个日志来告诉你这些事情