【问题标题】:JDO - Updating an ObjectJDO - 更新对象
【发布时间】: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;
}

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

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

    --安迪 (DataNucleus)

    【讨论】:

    • 如果对象已经设置了 ID,makePersistent 不起作用(例如,之前从数据存储区读取时,或从 Web 表单填充时)。
    • 如果对象是从数据存储中读取的并且在同一个事务中,那么调用 makePersistent 是没有意义的,任何更改都会自动放入数据存储中。如果从数据存储中读取对象然后分离并且您更改了某些内容,那么调用 makePersistent 肯定会“工作”,因为它附加了更改。如果您有具体问题,我建议您向 Google 的 appengine 小组报告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2012-03-14
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多