【发布时间】: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