延迟加载的嵌入对象不会完全获取GAE数据存储区

时间:2013-05-27 07:37:28

标签: java jdo google-cloud-datastore

我在我的父实体中遇到嵌入式实体的奇怪问题。

以下是代码

以下是我的孩子实体。

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class IOU{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String iouId;

    private String groupId;
    private String fromUserId;
    private String toUserId;
    private double amount; 
}

它嵌入在组内。

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Group {


    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
    private String groupId;


    private String groupName;
    private String groupType;
    private String ownerId;

    @Persistent(defaultFetchGroup = "true")
    private List<IOU> iouList;
}

我在存储它们时做了一些肮脏的工作,我不知道这是不是问题。 我按如下方式存储它们。

group = mgr.makePersistent(group);

ArrayList<IOU> alIOU = this.generateIOUEntries(alTotalMembers, group);
group.setIouList(alIOU);
group = mgr.makePersistent(group);

上面已经完成了,因为我需要在我的IOU中自动生成groupId。

现在问题是当我尝试获取我的群组时。 iou列表仅包含属性。

{
    "groupId" : "agdmZW0tZGV2cgsLEgVHcm91cBgEDA",
    "groupName" : "Test",
    "ownerId" : "agdmZW0tZGV2cgoLEgRVc2VyGAEM",
    "members" : [ {
      "userId" : "agdmZW0tZGV2cgoLEgRVc2VyGAIM",
    }, {
      "userId" : "agdmZW0tZGV2cgoLEgRVc2VyGAMM",
    }, {
      "userId" : "agdmZW0tZGV2cgoLEgRVc2VyGAEM",
    } ],
    "membersIdList" : [ "agdmZW0tZGV2cgoLEgRVc2VyGAIM", "agdmZW0tZGV2cgoLEgRVc2VyGAMM", "agdmZW0tZGV2cgoLEgRVc2VyGAEM" ],
    "iouList" : [ {
      "amount" : 0.0
    }, {
      "amount" : 0.0
    }, {
      "amount" : 0.0
    } ]
}

奇怪的是,如果我重新启动服务器。正确获取所有值。我是这个JDO世界的新手,所以我尝试了各种注释组合,但没有任何帮助。我猜这可能与我停止服务器时刷新到DB的一些缓存技术有关 在重新启动服务器之前,不会获取fromUserId和toUserId。 正确的输出看起来像这样。

{
    "groupId" : "agdmZW0tZGV2cgsLEgVHcm91cBgEDA",
    "groupName" : "Test",
    "ownerId" : "agdmZW0tZGV2cgoLEgRVc2VyGAEM",
    "members" : [ {
      "userId" : "agdmZW0tZGV2cgoLEgRVc2VyGAIM",
    }, {
      "userId" : "agdmZW0tZGV2cgoLEgRVc2VyGAMM",
    }, {
      "userId" : "agdmZW0tZGV2cgoLEgRVc2VyGAEM",
    } ],
    "membersIdList" : [ "agdmZW0tZGV2cgoLEgRVc2VyGAIM", "agdmZW0tZGV2cgoLEgRVc2VyGAMM", "agdmZW0tZGV2cgoLEgRVc2VyGAEM" ],
    "iouList" : [  {
  "fromUserId" : "agdmZW0tZGV2cgoLEgRVc2VyGAIM",
  "toUserId" : "agdmZW0tZGV2cgoLEgRVc2VyGAMM",
  "amount" : 0.0
}, {
  "fromUserId" : "agdmZW0tZGV2cgoLEgRVc2VyGAIM",
  "toUserId" : "agdmZW0tZGV2cgoLEgRVc2VyGAEM",
  "amount" : 0.0
}, {
  "fromUserId" : "agdmZW0tZGV2cgoLEgRVc2VyGAMM",
  "toUserId" : "agdmZW0tZGV2cgoLEgRVc2VyGAEM",
  "amount" : 0.0
} ]
}

要检索的代码非常简单,如下所示。为了懒洋洋地加载iouList,我通过调用它上面的getIouList()来触摸它。

Group group = mgr.getObjectById(Group.class, id);
group.getIouList()

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案。

以下问题提到了同样的问题。 One-to-Many relationship. Select objects from datastore

现在,我触摸了iouList中的每个IOU条目以加载它们。

Group group = mgr.getObjectById(Group.class, id);
group.getIouList()

for(IOU objIOU : group.getIouList()){
    objIOU.getFromUserId();
}

上面的代码加载了IOU列表中的每个属性。

我猜测之前只显示了数量,因为它是一个原始值为零,其他属性为null,并且在创建JSON时序列化中排除了空值。

我可能会尝试使用以下注释并更新相同内容。

@Persistent(mappedBy = "restaurant",defaultFetchGroup = "true")