Java 为什么JDO认为这个分离的对象是干净的?
我试图通过创建一个小型web应用程序来学习JDO(同时学习其GAE和Spring的复杂性),但在获取更新的域对象以将其持久化回数据库时遇到了困难。最初,我从数据库中获取实体并将其分离,以便向用户显示它并允许他们更改它。一旦用户进行了更改并将表单发布回应用程序,我将再次从数据库中获取实体(分离),更新其属性,然后调用Java 为什么JDO认为这个分离的对象是干净的?,java,google-cloud-datastore,jdo,Java,Google Cloud Datastore,Jdo,我试图通过创建一个小型web应用程序来学习JDO(同时学习其GAE和Spring的复杂性),但在获取更新的域对象以将其持久化回数据库时遇到了困难。最初,我从数据库中获取实体并将其分离,以便向用户显示它并允许他们更改它。一旦用户进行了更改并将表单发布回应用程序,我将再次从数据库中获取实体(分离),更新其属性,然后调用pm.makePersistent()。缩写代码如下: 用户域对象: @PersistenceCapable(detachable="true") public class User
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();
}
}
现在,当我开始使用update方法时,我已经通过检查它的hashCode()
,向自己证明了我正在使用读取的同一个对象,我已经使用域对象的setter方法更改了一个值,我甚至已经将更改后的值打印到控制台以确保它已经完成,JDOHelper.isDirty()
仍然返回false,因此所有更改都不会保留回数据库。
有没有想过我错过了什么,或者我是否从错误的角度来看待这个问题?感谢您帮助JDO初学者 JDOHelper.isDirty用于托管对象。分离的对象不受管理。DataNucleus提供了自己的助手方法,以在分离时获取脏字段,因为逻辑是特定于实现的
String[]dirtyFieldNames=NucleusJDOHelper.getDetachedObjectDirtyFields(obj,pm) 感谢您指出这一点,我在阅读文档时错过了这一点。仍然想知道为什么它不能识别分离对象中的数据已经更改,因此不能持久化这些更改。这就是为什么你有一个日志来告诉你这些事情