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

Java 延迟加载的嵌入对象不会完全从GAE数据存储中获取,java,jdo,google-cloud-datastore,Java,Jdo,Google Cloud Datastore,我面临着在父实体中嵌入实体的奇怪问题 下面是代码 下面是我的孩子实体 @PersistenceCapable(identityType = IdentityType.APPLICATION) public class IOU{ @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) @Extension(vendorName="datanucleus", key="gae.encoded-

我面临着在父实体中嵌入实体的奇怪问题

下面是代码

下面是我的孩子实体

@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;
}
奇怪的是,如果我重启服务器。所有值都已正确获取。我对这个JDO世界还不熟悉,所以我尝试了各种注释组合,但没有任何帮助。我猜这可能与某些缓存技术有关,当我停止服务器时,缓存技术会刷新到数据库中。
在我重新启动服务器之前,不会获取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()来触摸它


我找到了这个问题的答案

下面的问题提到了同样的问题。

现在,我在iouList中点击每个IOU条目来加载它们

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

for(IOU objIOU : group.getIouList()){
    objIOU.getFromUserId();
}
上面的代码加载列表中IOU的每个属性

我猜前面只显示了amount,因为它是一个原语,它的值为零,其他属性为null,并且在创建JSON时在序列化中排除了null

我可能会尝试使用以下注释的方法,并进行大致相同的更新

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

显然,由于没有@embedded注释或embeddedOnly=true属性,它们不是嵌入的。它们存储在不同的数据存储类型中。由于没有为检索定义JDO API代码,因此没有人能给出明智的意见。那么,您可以建议一个解决方案,不能将@Embedded与collection一起使用,这是他们的一种方法。为什么重启行为,这真的让我惊讶…解决方案是什么?你还没有提到你的检索代码,或者日志上说的是什么。Ready用检索代码更新了问题。谢谢你问了这么多问题,我找到了问题的答案。张贴。
Group group = mgr.getObjectById(Group.class, id);
group.getIouList()
Group group = mgr.getObjectById(Group.class, id);
group.getIouList()

for(IOU objIOU : group.getIouList()){
    objIOU.getFromUserId();
}
@Persistent(mappedBy = "restaurant",defaultFetchGroup = "true")