gpt4 book ai didi

java - 即使未指定 @Load,Objectify 也会在 Ref 后面加载对象

转载 作者:搜寻专家 更新时间:2023-10-31 08:19:45 24 4
gpt4 key购买 nike

我有一个引用用户对象的帐户对象。

@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);
}

}

我已按照此处的建议隐藏了 Ref:http://code.google.com/p/objectify-appengine/wiki/Entities - 请注意 Ref 有@Load 注释。

当我从 Android 客户端调用我的 Google Cloud Endpoint 时,看起来 Objectify 提供了带有嵌入式用户的帐户对象,即使未指定 @Load。

@ApiMethod(name = "account.get")
public Account getAccount(
@Named("id") final Long id
) {
return ofy().load().type(Account.class).id(id).now();
}

当我直接使用 Apis Explorer 查询账户时,我也得到了两个,嵌入了用户的账户:

200 OK
{
"id": "5079604133888000",
"user": { "id": "5723348596162560",
"version": "1402003195251",
"firstName": "Karl" },
"kind": "api#accountItem",
"etag": "\"30khohwUBSGWr00rYOZuF9f4BTE/Q31EvnQCQ6E9c5YXKEZHNsD_mlQ\""}

这提出了三个问题:

  1. Appengine 是否始终以 native 方式返回嵌入式 Refs,而 Objectify 是否始终传递它已知的对象?
  2. @Load 到底是做什么用的?有没有办法控制这种行为?负载组?
  3. 我错过了什么吗?为什么不遵守@Load?

最佳答案

在您的示例代码中,您没有指定 @Load这意味着加载帐户不会获取 User .但是,您的 @ApiMethod正在将帐户序列化回客户端,所以 user属性已被访问,因此发出单独的提取以加载用户对象。这就是您在调用该方法时获取用户信息的原因。

未指定 @Load并不意味着您不会得到 User背部。这意味着您不会检索 User除非你以后特别要求。

Ref 是这样工作的:

  • 我是引用,所以默认情况下我不会获取数据。
  • 如果你找我,我会先加载数据,然后再回答你。
  • 哦,如果你告诉我 @Load我自己,然后我将首先获取数据并为您准备好。

所以这在您的代码中工作正常...但是您的 @ApiMethod正在序列化您的 Account对象返回给客户。序列化过程正在遍历您的 Account 中的每个属性对象,包括 user属性(property)。此时,Ref<User>正在被访问,因此数据将从数据存储中获取,然后返回给客户端。

这会使您的代码非常低效,因为 Account加载对象时没有 User信息,但您总是访问 User信息稍后(在序列化期间),发出单独的提取。配料gets从数据存储比发出单独的 gets 更有效.

在您的情况下,您可以执行以下两项操作之一:

  1. 添加@Load到用户属性,所以 Account有效地获取对象。
  2. 让你的@ApiMethod返回一个不同的 Account没有 user 的对象属性(从而避免在不需要时获取用户)。

上面的选项 2 非常有用,因为您可以从客户端看到的内容中抽象出您的内部数据存储结构。您会发现自己经常使用这种模式。

关于java - 即使未指定 @Load,Objectify 也会在 Ref<?> 后面加载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24071134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com