2012-04-04 10 views

Antwort

1

Objectify nur types supported by the GAE Datastore bestehen kann. Java Typ Class ist nicht einer von ihnen.

Aufgrund von type erasure enthält das Feld fooType keine Informationen zu generischen Argumenten.

Nun gibt es ein paar Möglichkeiten, Class Typ zu speichern:

  1. Shop nur den langen Namen der Klasse, konvertieren via @ PrePersist/@ Postload. Der Vorteil davon ist, dass Sie eine normale String-Eigenschaft erhalten, die Sie abfragen können.

    @Transient // tells Objectify to ignore field 
    public Class<Foo> fooType; 
    
    @PrePersist 
        public prePersist(Entity entity){ 
        entity.setProperty("fooType", fooType.getName()) 
    } 
    
    @PostLoad 
    public postLoad(Entity entity){ 
        fooType = Class.forName(entity.getProperty("fooType")); 
    } 
    
  2. Serialize die Class (da es Serializable implementiert dies erlaubt ist). Dies wird Java-Serialisierung verwenden, um das Feld als Blob (max. 1 MB) zu erhalten. Es ist eine einfache Lösung, aber der Nachteil ist, dass die Eigenschaft nicht indiziert ist und nicht in Abfragen verwendet werden kann.

    @Serialize 
    private Class<Foo> fooType; 
    
3

standardmäßig nicht. Sie können jedoch relativ einfach einen Übersetzer hinzufügen, der eine Klasse als String nativ im Datenspeicher speichert. Sie verwenden Class.getName() beim Speichern und Class.forName() beim Laden.

Hier ist ein Beispiel dafür, was in Objectify3 zu tun:

http://code.google.com/p/objectify-appengine/source/browse/tags/3.1/src/com/googlecode/objectify/impl/conv/joda/DateTimeZoneConverter.java

Beachten Sie, dass in einzelnen Wandler null zurück, wenn die Typen auf den Konverter nicht relevant sind. Wie kann man das hier beschrieben wird:

http://code.google.com/p/objectify-appengine/source/browse/tags/3.1/src/com/googlecode/objectify/impl/conv/joda/JodaTimeConverters.java

Hier ist das Äquivalent in Objectify4:

http://code.google.com/p/objectify-appengine/source/browse/trunk/src/com/googlecode/objectify/impl/translate/opt/joda/DateTimeZoneTranslatorFactory.java

Wie es ermöglichen, ist hier beschrieben:

http://code.google.com/p/objectify-appengine/source/browse/trunk/src/com/googlecode/objectify/impl/translate/opt/joda/JodaTimeTranslators.java

+0

Ich mag Beide Antworten, aber ich denke, es ist besser, wenn OP weiß, wie man Übersetzer schafft kann in Zukunft alles bestehen bleiben. – expert