2009-04-21 4 views
2

Hallo bin ich versuche die neue Java-Unterstützung für Google App-Engine, und ich versuche, eine Persistency-Schicht für alle meine Objekte zu machen. Ich versuche, eine Freund-Verbindung zu modellieren, stoße aber auf Probleme. Ich verwende JPA, um die Objekte beizubehalten und meine Persistenzobjekte mit JPA-Anmerkungen zu definieren.Wie modelliere ich ein Freundessystem mit Persistency Layer?

war meine Idee, Folgendes zu tun:

Benutzerobjekt:

@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; 
} 

Aber wenn ich dies versuchen, erhalte ich die Fehlermeldung: App Engine ORM unterstützt nicht mehrere übergeordnete Schlüssel-Provider Felder

So hat jemand eine andere Idee, wie ein Freund System zu modellieren, ohne dass mehrere Eltern mit Schlüssel?

Hoffe jemand kann helfen!

Antwort

1

Ich habe die google app engine noch nie für ein Projekt verwendet, aber das erste, was Sie über ihre Persistenz wissen müssen, ist, dass es keine relationale Datenbank ist. Ich glaube, es verwendet einen Schlüsselwertspeicher.

Also müssen Sie bei der Verwendung der App Engine auf andere Weise an Persistenz denken.

Aus der Dokumentation:

Die folgenden Funktionen der PPV-Schnittstelle werden nicht von der App Engine-Implementierung unterstützt:

  • Owned many-to-many-Beziehungen und unowned Beziehungen. Sie können nicht zugeordnete Beziehungen mithilfe expliziter Schlüsselwerte implementieren, obwohl die Typprüfung in der API nicht erzwungen wird.
  • "Join" Abfragen. Sie können ein Feld einer untergeordneten Entität in einem Filter nicht verwenden, wenn Sie eine Abfrage für die übergeordnete Art durchführen. Beachten Sie, dass Sie das Beziehungsfeld des übergeordneten Elements direkt in der Abfrage mithilfe eines Schlüssels testen können.
  • Aggregationsabfragen (gruppieren nach, haben, Summe, Durchschnitt, max, min)
  • Polymorphe Abfragen. Sie können keine Abfrage einer Klasse ausführen, um Instanzen einer Unterklasse abzurufen. Jede Klasse wird im Datenspeicher durch eine separate Entitätsart dargestellt.

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

+0

überraschenderweise unterstützt GAP JPA, obwohl es auf BigTable läuft. –

+0

Ich weiß es, aber Sie können keine Joins in Tabellen verwenden. Daher müssen Sie Ihr Modell überdenken. –

+0

Ja, ich weiß das, ich habe nicht viel Erfahrung mit Ausdauer, aber ich könnte wirklich eine Idee verwenden, wie man dieses Modell angehen kann. –

2

In der Regel werden Sie alle Beziehungen, sich mit GAE pflegen müssen. Die besten Tools, die GAE dafür bereitstellt, sind im Abschnitt Unowned Relationships dokumentiert. Insbesondere glaube ich, dass der Abschnitt über "Viele-zu-viele" Beziehungen relevant ist.

Aus den Beispielen scheint es, dass Sie die meiste Arbeit für die Aufrechterhaltung der referenziellen Integrität selbst noch tun müssen. Da sich diese wahrscheinlich in separaten Entitätsgruppen befinden, benötigen Sie wahrscheinlich auch eine erhebliche Menge an Code, um mit potenziell beschädigten Beziehungen fertig zu werden.

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 
} 
Verwandte Themen