0

在 Google App Engine 应用程序中,我有这个模型:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Message {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    private Date timestamp;

    @Persistent
    private String text;

    @Unowned
    @Persistent(defaultFetchGroup = "true")
    private User sender;

    ...
}

该模型@Unowned与发送者有关系,因为用户可以独立于消息而存在。

我想做的是持久Message化带有部分User对象的对象(例如,我只对存储用户 ID 和用户名感兴趣)。在我的端点类中,我可以很好地存储消息,但是,如果我没有在关系中包含给定用户的所有字段,则用户对象会更新为缺少的字段(例如,相关用户不再有密码等.)。在不“破坏”原始对象的情况下实现我想要的最佳方法是什么?

PS 我的端点方法非常简单。基本上只是调用pm.makePersistent(message);消息(作为方法参数给出)。

4

1 回答 1

1

您正在使用@Unowned注释,这意味着只有对实际User实体的引用才会存储在您的类sender下的变量中。Message

当您访问该sender变量时,Datastore 将执行一个 get 查询来检索User链接到该消息的实体。

您可以通过导航到项目的 Datastore 仪表板(生产环境为https://console.cloud.google.com/datastore,本地为http://localhost:8080/_ah/admin)并浏览Message实体来确认这一点。

您应该会看到User存储 的字段,其名称类似于user_id_OID值为Key(User/XXXXX)

附带说明一下,Google 建议从 JDO/JPA 转移到 Objectify 或 Datastore API。

警告:我们认为大多数开发人员使用低级 Datastore API 或专为 Datastore 开发的开源 API 之一(例如 Objectify)会获得更好的体验。JDO 是为与传统关系数据库一起使用而设计的,因此无法明确表示 Datastore 的某些方面,这些方面使其不同于关系数据库,例如实体组和祖先查询。这可能会导致难以理解和修复的微妙问题。

见这里: https ://cloud.google.com/appengine/docs/java/datastore/jdo/overview-dn2

于 2016-07-14T12:57:15.153 回答