2016-07-13 4 views
0

を永続化するとき、私はこのモデルを持っている性質を除く:GoogleのApp Engineアプリケーションで所有されていないエンティティ関係のJDO(GAE)

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Message { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private Date timestamp; 

    @Persistent 
    private String text; 

    @Unowned 
    @Persistent(defaultFetchGroup = "true") 
    private User sender; 

    ... 
} 

ユーザーが独立して存在することができますので、モデルは、送信者に@Unowned関係を持っていますメッセージ。

私がやりたいことは、部分Userのオブジェクト(例えば、私はユーザーIDとユーザー名の格納にのみ関心があります)を持つオブジェクトMessageを永続させることです。私のエンドポイントクラスでは、私はメッセージを保存していますが、私は関係の特定のユーザーのすべてのフィールドが含まれていない場合、ユーザーオブジェクトはフィールドが失われて更新されます(例えば、 )。元のオブジェクトを「壊す」ことなく、私が望むものを達成する最良の方法は何ですか?

PS 私のエンドポイントメソッドは死にそうです。基本的には、メッセージ上でpm.makePersistent(message);を呼び出すだけです(メソッドパラメータとして与えられます)。

答えて

1

Userエンティティへの参照のみがクラスの変数senderに保存されることを意味する@Unowned注釈を使用しています。

変数senderにアクセスすると、Datastoreはgetクエリを実行してメッセージにリンクされているUserエンティティを取得します。

プロジェクトのデータストアダッシュボード(生産の場合はhttps://console.cloud.google.com/datastore、ローカルの場合はhttp://localhost:8080/_ah/admin)に移動し、Messageエンティティを参照することで、これを確認できます。

Userが保存されているフィールドには、Key(User/XXXXX)の値を持つuser_id_OIDという名前のフィールドが表示されます。

JDO/JPAからObjectifyまたはDatastore APIに移行することをお勧めします。

警告:私たちは、ほとんどの開発者は 低レベルDatastore API、またはオープンソースのAPIのいずれかを使用してより良い経験を持っているだろうと思い、このような客観化として、データストアのために特別に を開発しました。 JDOは従来のリレーショナルデータベースで を使用するように設計されているため、 をDatastoreのいくつかの側面を明示的に表現する方法はありません。 はエンティティグループや 祖先クエリなどのリレーショナルデータベースとは異なります。これは、 を理解して修正することが難しい微妙な問題につながる可能性があります。

はこちらをご覧ください: https://cloud.google.com/appengine/docs/java/datastore/jdo/overview-dn2

+1

感謝を!あなたは本当に私の質問には答えませんでしたが、あなたのサイドノートが面白いと感じました。私は、GoogleがJDOを使用しないよう助言していることは知らなかった。私はObjectifyを見ていきます。 –

+0

私は別の言い方をすることができたかもしれませんが、この場合の "User"エンティティは "Message"とは別個のエンティティであると言います。 - "User"エンティティを "メッセージ "エンティティ。つまり、ユーザーを別々に保存する必要があります。 – COBB

+0

はい、私はすでにこれをやっています。ユーザーはメッセージとは完全に別個に生きています(ユーザーオブジェクトは登録時に作成されます)。しかし、メッセージオブジェクトにユーザー(特定のユーザーのプロパティを意図的に残しておく)を付けると、元のユーザーオブジェクトが変更されます。 –

関連する問題