我正在尝试通过创建一个小型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()
从我的阅读中使用了同一个对象,我使用域名更改了一个值对象的setter方法,我甚至将更改后的值打印到控制台以确保它已完成,并且JDOHelper.isDirty()
仍然返回false,因此没有任何更改会持久化回数据库。
对于我缺少什么或者我是否从错误的角度接近这个想法?感谢您帮助JDO初学者!
答案 0 :(得分:1)
JDOHelper.isDirty用于托管对象。不管理分离的对象。 DataNucleus提供了自己的辅助方法,以便在分离时获取脏字段,因为逻辑是特定于实现的 String [] dirtyFieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields(obj,pm);