【问题标题】:Why does JDO think this detached object is clean?为什么 JDO 认为这个分离的对象是干净的?
【发布时间】:2010-12-21 14:36:44
【问题描述】:

我正在尝试通过创建一个小型 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();
    }
}

现在,当我开始使用更新方法时,我已经通过检查 hashCode() 向自己证明,我正在使用读取中的同一个对象,我已经使用域对象的设置器更改了一个值方法,我什至将更改的值打印到控制台以确保它完成,JDOHelper.isDirty() 仍然返回 false,因此没有任何更改被持久化回数据库。 关于我错过了什么或者我从错误的角度接近这个的任何想法?感谢您帮助 JDO 初学者!

【问题讨论】:

    标签: java google-cloud-datastore jdo


    【解决方案1】:

    JDOHelper.isDirty 用于托管对象。分离的对象不受管理。 DataNucleus 提供了一个自己的辅助方法来在分离时获取脏字段,因为逻辑是特定于实现的 String[]dirtyFieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields(obj, pm);

    【讨论】:

    • 感谢您指出这一点,我在阅读文档时错过了这一点。仍然想知道为什么它无法识别分离对象中的数据已更改,因此不会保留更改。
    • 这就是为什么你有一个日志,告诉你这样的事情
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多