持久存在无主实体关系jdo(gae)时排除属性

时间:2016-07-13 21:57:39

标签: google-app-engine jdo jdoql

在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);(作为方法参数给出)。

1 个答案:

答案 0 :(得分:1)

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

当您访问sender变量时,数据存储区将执行get查询以检索链接到该消息的User实体。

您可以导航到项目的数据存储仪表板(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,或开发的一个开源API   专门针对数据存储,例如Objectify。 JDO是专为   与传统的关系数据库一起使用,所以没办法   明确表示数据存储的一些方面   与关系数据库不同,例如实体组和   祖先查询。这可能导致难以解决的细微问题   理解并解决。

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