2009-04-21 11 views
2

こんにちは、私は、Googleのアプリケーションエンジンのための新しいJavaサポートをしようとしている、私はすべての私のオブジェクトのための永続性の層を作ろうとしています。私は友人の接続をモデル化しようとしていますが、問題が発生しています。 JPAを使用してオブジェクトを永続化し、JPAアノテーションで永続オブジェクトを定義します。永続性レイヤーを持つフレンドシステムをモデル化する方法は?

ユーザオブジェクト:

@Entity 
public class User { 

@Column(name="user_id") 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
private String id; 

@OneToMany(cascade={CascadeType.ALL},mappedBy="invitee") 
private List<Connection> IncConnections; 

@OneToMany(cascade={CascadeType.ALL},mappedBy="initiator") 
private List<Connection> OutConnections; 
} 

私の考えは、次の操作を実行することでした。

@Entity 
public class Connection { 

@Column(name="connection_id") 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
private String id; 

@ManyToOne(cascade={CascadeType.ALL}) 
User initiator; 

@ManyToOne(cascade={CascadeType.ALL}) 
User invitee; 
} 

しかし、私はこれをしようとすると、私はエラーを取得: App EngineのORMは、複数の親キープロバイダのフィールドに

をサポートしていないので、誰もが複数の親を使用せずに友人のシステムをモデル化するためにどのように他のアイデアを持っているんキー?

誰かが助けてくれることを願っています!

答えて

1

私はまだ実際にはGoogleのアプリケーションエンジンをプロジェクトに使用したことはありませんが、永続性について最初に理解する必要があるのは、リレーショナルデータベースではないということです。私はそれがキーバリューストアを使用していると信じています。

したがって、アプリエンジンを使用しているときに永続性を別の方法で考える必要があります。 JPAインターフェースの次の機能は、App Engineの実装でサポートされていない

:ドキュメントから

  • 多対多の関係、そして所有されていない関係を所有していました。明示的なKey値を使用して、所有されていないリレーションシップを実装できますが、タイプチェックはAPIでは実行されません。
  • "Join"クエリ。親の種類のクエリを実行するときに、フィルタ内の子エンティティのフィールドを使用することはできません。親の関係フィールドは、キーを使用してクエリで直接テストできます。
  • 集約クエリ(グループ化、合計、平均、平均、最小、最小)
  • 多型クエリ。クラスのクエリを実行して、サブクラスのインスタンスを取得することはできません。各クラスは、データストア内の別のエンティティの種類によって表されます。一般的に

http://code.google.com/appengine/docs/java/datastore/usingjpa.html

+0

驚いたことに、GAPはbigtableで動作しますが、JPAをサポートしています。 –

+0

私はそれが知っているが、テーブルに結合を使用することはできません。したがって、モデルを再考する必要があります。 –

+0

ええ、私はこのことを知っています。私は永続性についての非常に多くの経験を持っていません。だから、私はこのモデルに近づける方法を考えています。 –

2

、あなたはGAEでの任意の関係を自分で維持する必要があります。 GAEが提供する最良のツールは、Unowned Relationshipsのセクションに記載されています。特に、私は「多対多」関係のセクションが適切であると信じています。

例からは、参照整合性を自分で維持する作業の多くをやる必要があるようです。これらは別々のエンティティグループにある可能性が高いため、潜在的に壊れた関係に対処するためには相当な量のコードを用意する必要があります。

2
Using Objectify 

class User { 
    @Id Long userId; 
    String email; 
} 

class UserFriendMap { 
    @Id Long id; 
    @Parent OKey<User> parent; 
    Set<OKey<User>> friend; // 5000 max 
} 
関連する問題