我在父实体中遇到了嵌入实体的奇怪问题。
以下是代码
下面是我的子实体。
@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 世界的新手,所以我尝试了各种注释组合,但没有任何帮助。我猜这可能与我停止服务器时刷新到数据库的一些缓存技术有关。
在我重新启动服务器之前,不会获取 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()