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 - 更新对象的主要内容,如果未能解决你的问题,请参考以下文章
Google App Engine、JDO 和 equals/hashCode