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