我在我的父实体中遇到嵌入式实体的奇怪问题。
以下是代码
以下是我的孩子实体。
@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()
答案 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")