2

JDO 3.0 構文を使用して、所有されていない関係を定義しました。

@Persistent
@Unowned
private Set<Role> roles;

ユーザーに割り当てる必要がある定義済みの役割がいくつかあります。ユーザーにロールを追加/削除するには、次のコードを使用します。

roles.add(roleEntity);
roles.remove(roleEntity); 

問題は、このように削除すると元のエンティティもデータストアから削除されることですが、参照を削除したいだけです。問題を解決する親エンティティ内にキーのみを格納できることはわかっていますが、より良い解決策はありますか? この「自然な」構文を使用していますか?

4

3 に答える 3

2

私は同じことを見ています。確かに、私はこれらすべての初心者ですが、@Unowned を使用しても、最初に永続化されたときにあった ArrayList からアイテムを削除すると、オブジェクトはデータストアから削除されます。@Unowned を追加する前とほとんど同じように見えます。したがって、オブジェクトをあるオブジェクトの ArrayList から別のオブジェクトの ArrayList に転送できる唯一の方法は、remove() を呼び出す前に最初にそれを見つけてから、ディープ コピーを作成し、次に remove() してコピーを別のリストに置くことです。 . まったく自然ではありません。

于 2012-10-19T03:59:25.333 に答える
0

この質問には本当の最終的な答えが必要だと思います。

説明されている動作は、JDO のバグが原因であり、現在は修正されているはずです。詳細については、 http://code.google.com/p/datanucleus-appengine/issues/detail?id=290を参照してください。また、ドキュメントに記載されている内容に関係なく、ownedリレーションシップは常に であることに注意してください。dependent

残念ながら、 JDO 2.0に戻した後に修正されました。JDO 2.0 では、または を使用してunowned関係を実装します。実際、これは悪い解決策ではないので、 JDO 3.0をもう一度試すつもりはありません。子オブジェクトを取得するために使用するキーのコレクションについては、外部キーの場合、ステートメントを使用した単純なクエリを使用します。最初の解決策を使用した方が良い場合もあれば、2 番目の解決策を使用した方が良い場合もあります。いずれにせよ、すべてクリーンな API でカバーされているため、最終的なコードはシンプルで「自然」です。(このアプローチがドキュメントに直接記述されていることを願っています。そうすれば、難しい方法で学ぶ必要はありません。)collections of keysforeign keysbatch fetchwhere

重要なことは、どちらの場合も、元のエンティティを削除せずに関係を破棄できることです。それは本当のunowned関係です。

于 2012-10-19T09:58:18.183 に答える