Hi Jeff, thanks for the insightful points. I am the SimpleDS author,
and thought that maybe some of these issues need further explanation:

>  * Not enough use of generics.  Key, Query, and PreparedQuery should
> all be generified classes.

We tried that at first, but there is little benefit from that. We
settled for the use of generics for the find() method signatures,
which is what Google collections does, and that seems enough for our
use cases.

>  * Key should not be used as the id for a class.  The class itself
> identifies the Kind, so having a Key id carries redundant information
> that can be incorrect and cause problems.  This becomes really obvious
> when you generify the key class:
>
>  [...]
>
> Having an id field instead of a key makes queries easier.  With
> Objectify, you can create a query without needing to know that the id
> is part of a key field:
>
> query.filter("id >", 5000).sort("-id")

This would only work  with root entities, which are a minority. The
most common case is like this:

> class MyEntity {
>     @Id Long id;
>     @Parent OKey<ParentEntity> owner;
>
> }

This _is_ redundant since internally GAE stores the owner inside the
Key field. So we settled for the simplest solution, that was to make
visible the Key system used by GAE. It also makes getting by primary
key more efficient, since you don't have to pass the class.

>  * I don't like the way SimpleDS (or thelowlevelAPI) makes you pass
> around a Transaction object.  By maintaining the transaction within an
> instance of the Objectify/EntityManager/whatever interface, we can
> eliminate all the API method duplication.

I don't like it either, but GAE allows to have several transactions
open at the same time, affecting different shards. We wanted to
support that.

The way JDO circumvents this is by using several PersistenceManager
instances, but that seems weird to me.

>  * Classpath scanning shouldn't be required.  I wrote a bit about this
> here:http://code.google.com/p/objectify-appengine/wiki/BestPractices#Autom....
>  The short version:  Each and every library that does classpath
> scanning adds 3-5s to your cold start time.  Users see cold start
> time, even on a busy app.  It adds up.

We are not requiring classpath scanning. Actually, we have testcases
that just add the persistent classes using
PersistenceMetadataRepository.add() methods. OTOH, in our application
the persistence metadata is read in 1-2 seconds (using minor
optimizations like using classpath: instead of classpath*:), so we
decided it was not worth to remove it.

>  * I don't use (or like) Spring.

It is not required anyway. You can initialize SimpleDS using pure Java
(actually, we are doing that too). We only use Spring to do the
classpath scanning, since it has a really efficient implementation for
that.

> All that said, SimpleDS does some things that Objectify doesn't (like
> provide a query language and an IndexManager) so you might like it
> better.  It just wasn't for me.

Objectify also has some things that we don't, like better support for
GWT and caching, which is a work in progress in SimpleDS. Make your
pick :)

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-j...@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to