親エンティティ内の埋め込みエンティティで奇妙な問題に直面しています。
以下はコードです
以下は私の子エンティティです。
@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()