2012-03-31 6 views
0

ich eine Situation habe - in meiner Equipment Klasse Ich habe eine Liste von Geräten AuscheckvorgängeObjectify viele zu eins mit Eltern und RequestFactory

List<Key<EquipmentCheckout>> field 

nach der Antwort auf diese Frage zu lesen: Objectify Relationships: One-to-Many, Can I do this efficiently? - es scheint, als effizientes Weg, dies zu tun, ist eine Klasse namens EquipmentCheckouts zu schaffen, die in etwa wie folgt aussehen: jetzt

class EquipmentCheckouts 
    @Id 
    Long id 

    @Parent 
    EquipmentType equipmentType 

    @Indexed 
    List<EquipmentCheckout> equipmentCheckouts 

- hier ist das, was ich frage mich - ich bin mit RequestFactory und ich glaube, die RequestFactory einen Fund haben muss (Lange ID) Methode. Von dem, was um eine EquipmentCheckouts Objekt mit einem Equipment Eltern abrufen möchten Sie zu tun haben etwas entlang der Linien der folgenden Ich verstehe:

Key<EquipmentType> key = ObjectifyService.factory().getKey(equipmentType) 
return ofy.get(new Key<EquipmentCheckouts>(key, EquipmentCheckouts.class, id)) 

Also, wenn Sie nicht die Equipment in der Entdeckung haben könnte (Long ID) Methode Wie soll man das machen?

Für alles andere in meinem System habe ich ein Geschäft Eltern, die in der Sitzung angemeldeter Benutzer gespeichert wird, auf diese Weise, wenn ich gehe, um alles abzurufen ich den Benutzer authentifizieren dann Schlüssel das Geschäft zu finden, was auch immer es ist. Ich habe das Gefühl, dass ich etwas nicht verstehe, wenn ich @Parent in Objectify richtig verwende.

+0

möglich Duplikat [GWT Requestfactory Einheit Locator mit Objectify funktioniert nicht, wenn die Entity Lange id hat] (http://stackoverflow.com/questions/9750650/gwt-requestfactory-entity-locator-does-not -work-with-objectify-when-the-entity-h) –

+0

Sie haben Recht - ich habe das nicht in der Suche gesehen - ich benutze den Link auf dieser Seite, um dies für jetzt zu lösen http: // nimbettecnologia .blogspot.com/2011/01/requestfactory-objectify.html - danke –

Antwort

2

Sie müssen Ihre eigene Locator implementieren, die Entitäten mit Parent unterstützen würde. Wie Sie richtig notiert haben, können Sie nicht nur lange IDs verwenden, da sie keinen Schlüssel eines Elternteils haben. Ich habe dieses Problem gelöst, indem ich den Locator implementiert habe, der einen zusammengesetzten String-Schlüssel verwendet, der den vollständigen Pfad zum Objekt enthält.

Wichtig ist hier, dass Composite-Schlüssel nur für RPC verwendet wird. Ihre Entitäten verwenden weiterhin eine lange ID und müssen nicht geändert werden.

Hier ist Code-Schnipsel:

public class PojoLocator extends Locator<DatastoreObject, String> 
{ 
    @Override 
    public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id) 
    { 
     Key<DatastoreObject> key = Key.create(id); 
     return ofy.load(key); 
    } 

    @Override 
    public String getId(DatastoreObject domainObject) 
    { 
     if (domainObject.getId() != null) 
     { 
      Key<DatastoreObject> key = ofy.fact().getKey(domainObject); 
      return key.getString(); 
     } else 
      return null; 
    } 
} 

Sie können die Vollversion von meinem Locator here sehen.

0

Es müssen nicht nur Long in RequestFactory interface sein. Wie docs sagen:

Built-in value types: BigDecimal, BigInteger, Boolean, Byte, Enum, Character, Date,  Double, Float, Integer, Long, Short, String, Void 
Custom value types: any subclass of ValueProxy 
Entity types: any subclass of EntityProxy 
Collections: List<T> or Set<T>, where T is one of the above value or entity types 

So können Sie zwei Long-Positionen haben: find(Long, Long). Eine für den Elternteil und die andere für den Vater.

+0

Ich bin verwirrt - in der Anfrage Factory Locator-Klassen die überschriebene Find-Methode nimmt nur Klasse , Long - es gibt nur 1 Parameter für die Find-Methode, also wie würdest du eigentlich einen Find implementieren (Long, Long) ?? –

0

Ruslan Antwort ist genau richtig. Es löst das Problem für Entitäten mit Eltern und arbeitet weiterhin für Wurzel-Entitäten.

Ich kopiere hier eine aktualisierte Version des Locator-Codes mit Objectify 4 für den Fall, dass es für jeden, der vorbeikommt, nützlich ist.

@Override 
    public EntityObject find(Class<? extends EntityObject> clazz, String id) { 

     Key<EntityObject> key = Key.create(id); 

     EntityObject ob = ofy().load().key(key).now(); 
     return ob; 
    } 


    @Override 
    public String getId(EntityObject domainObject) { 

     if (domainObject.getId() != null) 
     { 
      Key<EntityObject> key = Key.create(domainObject); 
      return key.getString(); 
     } else 
      return null; 
    }