![](/img/trans.png)
[英]Google App Engine Objectify - load single objects or list of keys?
[英]foreign keys in objectify / google app engine
我正在嘗試使用Objectify為Google App Engine編寫應用程序,並且遇到了一些麻煩。 我是noSQL數據存儲的新手,所以這可能是一個概念問題。
我有一個稱為消息的實體,每個消息都有一個來自用戶的用戶-創建該消息的用戶。
@Entity
public class Message {
@Index private Key<User> fromUserKey;
@IgnoreSave private User fromUser;
煩人的是,我必須在消息中同時包含用戶和密鑰字段。 JSON需要User對象才能用有用的字段填充響應,而Google App引擎需要Key才能存儲對用戶的引用。 @IgnoreSave批注用於阻止Objectify要求Google App引擎嘗試存儲User對象(這將失敗)。
提取消息時,將填充from用戶密鑰,但不會填充from User對象。 這是我的“ getMessages”操作的DAO代碼的樣子:
public static List<Message> getSentMessages(long userId) {
List<Message> result;
result= ofy().load().type(Message.class).filter("from", Key.create(User.class, userId)).limit(1000).list();
return result;
}
但是,不會在每個Message上填充fromUser對象,而只會填充fromUserKey。 如何獲得響應中填充的實際User對象? 我需要訪問諸如姓氏,姓氏等字段,而不僅僅是用戶ID。 我可以從數據庫中獲得User的權限,遍歷結果,然后在每條消息上調用setFromUSer,但這很丑陋。 而且還會導致ConcurrentModificationException ...
我確定我在這里做錯了什么,但我無法解決。
您可以做的是在Message
實體上具有屬性Ref<User>
,並用'@Parent'對其進行注釋。 這意味着每個Message
實體將成為用戶實體組的一部分。 Ref<?>
像鍵一樣工作,但是允許您直接訪問實際的實體對象。 這樣,您可以輕松獲得姓氏,姓氏等。
如下更改您的班級:
@Entity
@Cache
public class Message
{
@Id Long id;
@Load @Parent private Ref<User> user;
public User getUser() { return this.user.get(); }
public void setUser(User value) { this.user = Ref.Create(value); }
}
完成此操作后,您將能夠執行祖先查詢以檢索與特定用戶關聯的所有消息實體:
public static List<Message> getSentMessages(long userId)
{
User parent = ofy().load().type(User.class).id(userId).now();
List<Message> results = ofy().load().type(Message.class).ancestor(parent).limit(1000).list();
return results;
}
現在,您應該能夠做您想做的事情,並且希望不會再出現任何錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.