JDO - 更新对象

Posted

技术标签:

【中文标题】JDO - 更新对象【英文标题】:JDO - Updating an Object 【发布时间】:2010-10-20 03:57:48 【问题描述】:

我正在试验 Google App Engine 和持久选项 JDO。 我想知道是否可以将瞬态对象映射到持久对象?或者使用瞬态对象来更新持久对象?

在编码示例中,我看到以下用于更新对象的代码:

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();


但这不是我想要的,有人知道我是否可以像 JPA 那样更新整个对象:object.update();

所以我想要这样的东西:

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;

【问题讨论】:

【参考方案1】:

“瞬态”对象没有“身份”,因此无法在数据存储中找到它。仔细考虑是否要使用瞬态对象,或者仅使用分离对象是否更好。 JPA 使用“分离”对象的等价物。 JDO 也可以这样做,然后您只需调用 pm.makePersistent(detachedObj);

--安迪 (DataNucleus)

【讨论】:

如果对象已经设置了 ID,makePersistent 不起作用(例如,之前从数据存储区读取时,或从 Web 表单填充时)。 如果对象是从数据存储中读取的并且在同一个事务中,那么调用 makePersistent 是没有意义的,任何更改都会自动放入数据存储中。如果从数据存储中读取对象然后分离并且您更改了某些内容,那么调用 makePersistent 肯定会“工作”,因为它附加了更改。如果您有具体问题,我建议您向 Google 的 appengine 小组报告

以上是关于JDO - 更新对象的主要内容,如果未能解决你的问题,请参考以下文章

查询未检索到嵌入式 JDO 字段

Google App Engine、JDO 和 equals/hashCode

通过 GWT-RPC 发送持久的 JDO 实例

jdo/OSGi:捆绑更新后构建 JDO PersistenceManagerFactory 时出错

Gae Jdo 对具有双向导航的一对多拥有关系的持久性

ORM + 关系数据库可以被认为是对象关系数据库管理系统吗?