0

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

以下是代码

下面是我的子实体。

@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()
4

1 回答 1

0

我找到了问题的答案。

以下问题提到了同样的问题。 一对多关系。从数据存储中选择对象

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

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

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

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

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

我可能会尝试使用以下注释并更新相同的方法。

@Persistent(mappedBy = "restaurant",defaultFetchGroup = "true")
于 2013-05-28T07:32:05.230 回答