0

こんにちは、子エンティティのリストを持つ A という親エンティティがあり、 List<B> children と言っています。

アプリケーションにとって重要であるため、子エンティティの順序を維持する必要があります。

私が行った方法は次を使用しています: https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Owned_One_to_Many_Relationships

順序付きコレクションが順序を維持する方法。

@Persistent

@Element(dependent = "true")

@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="index ASC"))

private List objects;

今、私は次を使用してリストに追加します:

newObj.setIndex(0);

for (int i = 0; i < objList.size(); i++) {

objList.get(i).setIndex(i + 1);

}

objList.add(newObj);

次を使用して移動:

if (direction.equalsIgnoreCase("up")) {

objList.get(index).setIndex(index - 1);

objList.get(index - 1).setIndex(index);

}

else if (direction.equalsIgnoreCase("down")) {

objList.get(index).setIndex(index + 1);

objList.get(index + 1).setIndex(index);

}

そして、次を使用して削除します:

for (int i = index + 1; i < objList.size(); i++) {

objList.get(i).setIndex(i - 1);

}

objList.remove(index);

これは正しい方法ですか?追加と移動が機能しているようです。しかし、削除は奇妙な動作をします。ランダムなオブジェクトが削除され、リストが完全に矛盾した状態になります!

GAE: 1.7.2

DataNucleus エンハンサー (バージョン 3.1.0.m2)

4

2 に答える 2

0

インデックスでの削除は、インデックス付きリスト (つまり、標準の JDO リスト) に対してのみ意味があり、それを使用していません。DataNucleus と RDBMS でそれを呼び出すと、例外がスローされます。明らかに、GAE はそのような細かな点を回避できませんでしたが、論理的にはそれが示唆されます。順序付きリストから何かを削除するには、実際にはremove(Object)を呼び出す必要があります。

このインデックス列の設定を使用してオブジェクトを移動すると、次の読み取り時に機能する可能性があります。「順序付け」句が行う唯一のことは、読み込まれた時点で順序付けを行うことです。

于 2012-10-26T07:44:49.343 に答える
0

すべてのインデックスを調整する前に objList.remove() を呼び出してみてください。

于 2012-10-26T04:15:58.817 に答える