這裏和網絡上有很多文章,但這些文章都針對不同的Objectify版本,並且似乎不適用於其中一個原因。Objectify後端和客戶端之間的往返傳輸[無GWT]
我有一個實體,它引用了另一個實體(例如帳戶實體引用用戶實體):
@Cache
@Entity
public final class Account {
@Id Long id;
@Index private Ref<User> user;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public User getUser() {
return user.get();
}
public void setUser(User user) {
this.user = Ref.create(user);
}
}
我試圖做到這一點:
- 從客戶端,獲取通過REST/Google Cloud Endpoints帳戶實體。
- 修改資源。
- 在服務器上更新它。
正如這裏所討論的Objectify loads object behind Ref<?> even when @Load is not specified上面的代碼總是返回引用的用戶,以及我不想要的。
正如@svpino所建議的那樣,「使您的@ApiMethod返回一個不帶用戶屬性的不同Account對象(從而避免在不需要的情況下提取用戶)」。只要我不想更新資源,這就可以工作。如果我需要更新,鑰匙/參考需要保留(即使我不需要客戶端)。
我可以看到的一種可能的方法是使用Key而不是Ref並呈現Web安全字符串,然後在UPDATE期間重新創建用戶。
private Key<User> user;
public String getUser() {
return user.toString();
}
public void setUser(String user) {
this.user = Key.create(user);
}
的字符串看起來像「密鑰(用戶(5723348596162560))」,但它似乎並沒有被重組(至少我得到一個異常這裏,還沒有跟蹤它尚未)。
另一種方法是編寫一個@ApiTransformer,它也沒有解決問題。
Jeff @StickFigure在過去幾年中發佈了好幾次,這個問題似乎還沒有解決。
Objectify 5.0.2的當前狀態是什麼?當客戶端不需要密鑰時,在往返間保留密鑰的建議是什麼?
「物化負載體REF >後面即使'@不指定Load'是」不正確。當您調用Ref.get()時,Objectify將對象加載到Ref的後面。你問它,你明白了,就這麼簡單。 '@ Load'可以讓你優化加載操作。 – stickfigure
如果您想在Ref >附近做更巧妙的事情,您可以在返回值之前檢查Ref.isLoaded()狀態。但請記住,這會檢查會話的狀態,因此如果該值已在請求的較早部分加載,它將返回true。 – stickfigure