Yep that is eventually what I ended up doing and it seems to work
relatively
well!

Having some problems with queries on embedded objects such as:

SELECT c FROM Company where c.address.state='CA'

where Address is an @Embedded/@Embeddable with a String 'state' field
therein ...

The query runs but returns no matches

a similar query

select c from Company where c.address.state like 'WY' throws an
exception that suggests JPA thinks 'state' is a class ...

any thoughts?

thanks


On Sep 1, 11:58 am, "Jason (Google)" <[email protected]> wrote:
> If you use a Long, App Engine will try to create the ID for you, and it will
> throw the error above if you try to set it yourself. The most
> straightforward solution here is to use a String like you had originally and
> add a constant prefix so it's guaranteed to not start with a number.
>
> As an aside, JDO and JPA are both open standards for Java persistence. If
> you're interested in code portability, you can use either standard. Given
> the issues that you're having, you may want to experiment with the JDO
> interface since it's better documented for App Engine.
>
> - Jason
>
>
>
> On Sun, Aug 30, 2009 at 5:38 PM, Larry Cable <[email protected]> wrote:
>
> > the problem is simple:
>
> > @Entity
> > public class Company implements Serializable {
> >    // ...
> >    public Company(String irsEIN) {
> >        ein = irsEIN;
> >        // ...
> >    }
>
> >   �...@id String ein; // the IRS EIN for the company ... this is a
> > unique id and a good one to use for PK?
>
> >   // ...
> > }
>
> > ... no it isn't because you get an exception when you commit one of
> > these suckers:
>
> > WARNING: java.lang.IllegalArgumentException: Name may not start with a
> > digit.
> >        at com.google.appengine.api.datastore.Key.<init>(Key.java:112)
> >        at com.google.appengine.api.datastore.Key.<init>(Key.java:89)
> >        at com.google.appengine.api.datastore.KeyFactory.createKey
> > (KeyFactory.java:72)
> >        at com.google.appengine.api.datastore.KeyFactory.createKey
> > (KeyFactory.java:57)
> >        at com.google.appengine.api.datastore.Entity.<init>(Entity.java:114)
> >        at
> > org.datanucleus.store.appengine.DatastoreFieldManager.storeStringPKField
> > (DatastoreFieldManager.java:511)
> >        at
> > org.datanucleus.store.appengine.DatastoreFieldManager.storeStringField
> > (DatastoreFieldManager.java:421)
> >        at org.datanucleus.state.AbstractStateManager.providedStringField
> > (AbstractStateManager.java:1023)
> >        at com.charityblossom.dao.entities.Charity.jdoProvideField
> > (Charity.java)
> >        at com.charityblossom.dao.entities.Charity.jdoProvideFields
> > (Charity.java)
> >        at org.datanucleus.state.JDOStateManagerImpl.provideFields
> > (JDOStateManagerImpl.java:2715)
> >        at
> > org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject
> > (DatastorePersistenceHandler.java:180)
> >        at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent
> > (JDOStateManagerImpl.java:3185)
> >        at org.datanucleus.state.JDOStateManagerImpl.flush
> > (JDOStateManagerImpl.java:4513)
> >        at org.datanucleus.ObjectManagerImpl.flushInternal
> > (ObjectManagerImpl.java:2814)
> >        at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:
> > 2754)
> >        at
> > org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:
> > 2893)
> >        at org.datanucleus.TransactionImpl.internalPreCommit
> > (TransactionImpl.java:369)
> >        at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:256)
> >        at org.datanucleus.jpa.EntityTransactionImpl.commit
> > (EntityTransactionImpl.java:104)
>
> > ...
>
> > So, you think, "no problem I actually want it as a number anyway..."
> > so you change the code like so:
>
> > @Entity
> > public class Company implements Serializable {
> >    // ...
> >    public Company(Long irsEIN) {
> >        ein = irsEIN;
> >        // ...
> >    }
>
> >   �...@id Long ein; // the IRS EIN for the company ... this is a unique
> > id and a good one to use for PK?
>
> >   // ...
> > }
>
> > Problem solved? ....
>
> > WARNING: javax.persistence.PersistenceException: Attempt was made to
> > manually set the id component of a Key primary key.  If you want to
> > control the value of the primary key, set the name component instead.
> >        at
> > org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException
> > (NucleusJPAHelper.java:264)
> >        at org.datanucleus.jpa.EntityTransactionImpl.commit
> > (EntityTransactionImpl.java:122)
>
> > Nope! ...
>
> > Now I want to use JPA because I want my code to be portable, so I
> > really dont want to care about JDO,
> > DataNucleus or the App Engine Datastore ...
>
> > This exception error message is meaningless to me ... even after
> > reading the App Engine and DataNucleus
> > documentation ...
>
> > Also, on a slightly related issue, should I have to obtain an
> > EntityManager transaction for each instance
> > of this class I wish to persist?
>
> > I'd appreciate any suggestions anyone might have?- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to