要通过对象的键检索对象,请使用 PersistenceManager 的 getObjectById()
方法。该方法采用对象的类和键:
Key k = KeyFactory.createKey(Employee.class.getSimpleName(), "[email protected]"); Employee e = pm.getObjectById(Employee.class, k);
如果类使用的键字段为未编码字符串 ID (String
) 或数字 ID (Long
),则 getObjectByID()
可以采用简单值作为键参数:
Employee e = pm.getObjectById(Employee.class, "[email protected]");
键参数可以为任何支持的键字段类型(字符串 ID、数字 ID、键值、编码键字符串),且类型可以与类中的键字段的类型不同。App Engine 必须能够从类名和提供的值派生出完整的键。字符串 ID 与数字 ID 是互斥的,因此使用数字 ID 的调用绝不会返回带字符串 ID 的实体。如果使用了键值或编码键字符串,则键必须引用类型由类表示的实体。
使用 JDO 更新对象的一种方式是抓取对象,然后在返回该对象的 PersistenceManager 仍然处于打开状态的情况下对该对象进行修改。当关闭 PersistenceManager 时,会保留修改。例如:
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(); } }
因为 Employee
实例是由 PersistenceManager 返回的,所以 PersistenceManager 已知对 Employee
上的持久字段所做的任何修改,并将在 PersistenceManager 关闭时自动使用这些修改更新数据存储区。PersistenceManager 已知进行这些修改的原因是 Employee 实例已“附加”到 PersistenceManager。
您可以通过将类声明为“可分离”,在 PersistenceManager 关闭后对该对象进行修改。为此,请将 detachable
属性添加到@PersistenceCapable
批注:
import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true") public class Employee { // ... }
现在您可以在载入 Employee 对象的 PersistenceManager 关闭后读取和写入该对象的字段。下例说明分离对象的作用:
public Employee getEmployee(User user) { PersistenceManager pm = PMF.get().getPersistenceManager(); pm.setDetachAllOnCommit(true); try { e = pm.getObjectById(Employee.class, "[email protected]"); } finally { pm.close(); } return e; } public void updateEmployeeTitle(Employee e, String newTitle) { if (titleChangeIsAuthorized(e, newTitle) { e.setTitle(newTitle); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(e); } finally { pm.close(); } } else { throw new UnauthorizedTitleChangeException(e, newTitle); } }
分离对象是创建数据传输对象的一种良好的替代选择。有关使用分离对象的详细信息,请参阅 DataNucleus 文档。
要将对象从数据存储区中删除,请对该对象调用 PersistenceManager 的 deletePersistent()
方法。
pm.deletePersistent(e);
如果某个对象的字段同样包含持久的子对象,则这些子对象也将被删除。有关详细信息,请参阅关系。