gae 数据存储说明 3

通过键获取对象

要通过对象的键检索对象,请使用 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);

如果某个对象的字段同样包含持久的子对象,则这些子对象也将被删除。有关详细信息,请参阅关系

你可能感兴趣的:(GAE)