したがって、私は子供を順序付きリストに保つために一方向の1対多の関係があります。彼らはすでに "index"プロパティを持っているので、私はhttp://code.google.com/appengine/docs/java/datastore/jdo/relationships.htmlのアドバイスに従い、 "list-ordering"拡張子を使ってindex-propertyを使って、自動生成されたものを使うのではなく、子の順番を決めようとしました。DataNucleusのリストオーダー拡張を使用すると空のリストになる
残念ながら、できるだけ早く私は、注釈を追加すると、それは子どもを返す停止し、私だけの空のリストを与えます。
私はこの単純な例での問題を再作成:
@PersistenceCapable(detachable = "true")
@FetchGroup(name = "parent.children", members = {@Persistent(name = "children")})
public class Parent {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
@Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="index ASC"))
private List<Child> children;
// getters/setters
}
@PersistenceCapable(detachable = "true")
public class Child {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private Integer index;
// getters/setters
}
DAO:
public void save(T entity) {
PersistenceManager pm = getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(entity);
tx.commit();
} finally {
if(tx.isActive())
tx.rollback();
pm.close();
}
}
public T get(Key key, String... fetchGroups) {
PersistenceManager pm = getPersistenceManager();
Transaction tx = pm.currentTransaction();
addFetchGroups(pm, fetchGroups);
try {
tx.begin();
pm.setDetachAllOnCommit(true);
T entity = (T) pm.getObjectById(entityClass, key);
tx.commit();
return entity;
} finally {
if(tx.isActive())
tx.rollback();
pm.close();
}
}
テストコード:
Parent parent = new Parent();
Child child = new Child();
child.setIndex(10);
parent.getChildren().add(child);
mParentDao.save(parent);
Parent parent2 = mParentDao.get(parent.getKey(), "parent.children");
は私が間違っているのことを特に何かがありますか?
ここ[編集]関連するログ出力である:
データストア:キー親を持つ種類の子実体を置く(3:キー親と種類親エンティティ(NO-ID-まだ)
データストアを置きます)/ CHILD(NO-ID-まだ)
データストア:INDEX:10
データストア:コミットデータストアトランザクション:0
データストア:新しいデータストアトランザクションを開始:1
データストア:キー親と種類PARENTの取得エンティティ(3 )
Datastore.Retrieve:準備中種類CHILDの(3)親のすべての子供たちのために照会する
Datastore.Retrieve:追加されました並べ替え:インデックスASCENDING
Datastore.Retrieve:クエリが0の結果を持っていました。
データストア:コミットデータストアトランザクション:1
私の作品:リストがでマークされていても。私はGAEプラグインのv2を使用しています。あなたがGAEデータストアへのputsとgetsを伝えるので、ログを使用してデバッグしてください – DataNucleus
ログ出力の一部を追加しました。エンティティは正しく追加され、データストアに表示されますが、何らかの理由で子供を照会すると0の結果が返されます。 –
私はしばらくの間困惑していた同様の問題を抱えていました。順序付きリストは注意して使用する必要があります。特に、コミットする前に順序付けフィールドを変更する場合は注意が必要です。回避策:オーダー・タグを削除し、リストにCOMPARATORを実装します。 – marcolopes