簡體   English   中英

objectify / Google App Engine中的外鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM