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")