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 のリストには、プロパティとして amount のみが含まれています。

{
    "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()
4

1 に答える 1

0

問題の答えを見つけました。

次の質問は、同じ問題について言及しています。 一対多の関係。データストアからオブジェクトを選択

とりあえず、iouList の各 IOU エントリに触れて、それらをロードしました。

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

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

上記のコードは、リスト内の IOU の各プロパティをロードします。

プリミティブの値がゼロで、他のプロパティが null であり、JSON の作成中にシリアライゼーションで null が除外されたため、以前は金額のみが表示されていたと推測しています。

次のアノテーションを使用するアプローチを試して、同じことを更新するかもしれません。

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