Max, thanks for letting me know.  I'm going to work around it for now
by turning it into a OneToMany and differentiating the values myself.

Len

On Oct 29, 4:17 pm, "Max Ross (Google)" <maxr+appeng...@google.com>
wrote:
> This is a current limitation that  I hope to get rid of fairly soon.  The
> problem is that the parent does not have the key of the child as a field.
> Instead, in order to find the child, the parent issues an ancestor query to
> find the single object of the appropriate type that is a direct descendant.
> I describe the reason for this odd implementation in detail in my Google IO
> talk <http://www.youtube.com/watch?v=2jW2iSKDipY> from last summer.  An
> annoying side effect of this implementation is that you can't have two
> relationship fields of the same type because we have no way of knowing which
> child is associated with which field.  We'll get it straightened out in the
> next few releases, I promise.
>
> Max
>
>
>
> On Wed, Oct 28, 2009 at 9:49 PM, lent <lentakeu...@gmail.com> wrote:
>
> > Hello,
>
> > I'm using JPA with SDK 1.2.5 and I'm having a problem with multiple
> > owned One To One relationships where the relationships are to the same
> > type.  The code is as below and Contributor class has three owned One
> > to One relationships to ContentValue.
>
> > What I'm finding is that when I set one of the One to One properties
> > in one transaction (e.g. picutre) in one request and then later on in
> > a different request and transaction I retrieve another of the One to
> > One properties (e.g. tagData), I get back the ContentValue I set for
> > the first property (picture).
>
> > I'm doing the following to set the property:
>
> > Contributor contributor = <load contributor here>;
> > ContentValue picture = contributor.getPicture();
> > if ( picture == null ) {
> >        picture = new ContentValue();
> >        contributor.setPicture( picture );
> >        pictureContent.setContentValueType( ContentValueType.PICTURE );
> > }
> > ...
>
> > If anyone knows why I'm having this problem, please let me know.
>
> > Regards,
> > Len
>
> > Contributor.java
> > ----------------
>
> > package abc;
>
> > //import com.google.appengine.api.datastore.Key;
> > //import com.google.appengine.api.datastore.KeyFactory;
> > import org.datanucleus.jpa.annotations.Extension;
>
> > import javax.persistence.AttributeOverrides;
> > import javax.persistence.CascadeType;
> > import javax.persistence.Embedded;
> > import javax.persistence.FetchType;
> > import javax.persistence.Entity;
> > import javax.persistence.Enumerated;
> > import javax.persistence.GeneratedValue;
> > import javax.persistence.GenerationType;
> > import javax.persistence.Id;
> > import javax.persistence.OneToMany;
> > import javax.persistence.OneToOne;
> > import javax.persistence.Transient;
>
> > import java.util.ArrayList;
> > import java.util.Date;
> > import java.util.List;
> > import java.util.Date;
>
> > @Entity
> > public class Contributor {
> >       �...@id
> >       �...@generatedvalue(strategy=GenerationType.IDENTITY)
> >       �...@extension(vendorName="datanucleus", key="gae.encoded-pk",
> > value="true")
> >        private String id;
>
> >       �...@enumerated
> >        private String firstName;
>
> >       �...@enumerated
> >        private String lastName;
>
> >       �...@onetoone(cascade = CascadeType.ALL, fetch = FetchType.LAZY )
> >        private ContentValue picture;
>
> >       �...@onetoone(cascade = CascadeType.ALL, fetch = FetchType.LAZY )
> >        private ContentValue thumbnailPicture;
>
> >       �...@onetoone(cascade = CascadeType.ALL, fetch = FetchType.LAZY )
> >        private ContentValue tagData;
>
> >        public void setId(String id) {
> >                this.id = id;
> >        }
>
> >        public String getId() {
> >                return id;
> >        }
>
> >        public void setFirstName(String firstName) {
> >                this.firstName = firstName;
> >        }
>
> >        public String getFirstName() {
> >                return firstName;
> >        }
>
> >        public void setLastName(String lastName) {
> >                this.lastName = lastName;
> >        }
>
> >        public String getLastName() {
> >                return lastName;
> >        }
>
> >        public void setPicture(ContentValue picture) {
> >                this.picture = picture;
> >        }
>
> >        public ContentValue getPicture() {
> >                return picture;
> >        }
>
> >        public void setThumbnailPicture(ContentValue thumbnailPicture) {
> >                this.thumbnailPicture = thumbnailPicture;
> >        }
>
> >        public ContentValue getThumbnailPicture() {
> >                return thumbnailPicture;
> >        }
>
> >        public void setTagData(ContentValue tagData) {
> >                this.tagData = tagData;
> >        }
>
> >        public ContentValue getTagData() {
> >                return tagData;
> >        }
>
> > }
>
> > ContentValue.java
> > -----------------
> > package abc;
>
> > import org.datanucleus.jpa.annotations.Extension;
>
> > import com.google.appengine.api.datastore.Blob;
>
> > import javax.persistence.AttributeOverrides;
> > import javax.persistence.Entity;
> > import javax.persistence.CascadeType;
> > import javax.persistence.Enumerated;
> > import javax.persistence.Embedded;
> > import javax.persistence.GeneratedValue;
> > import javax.persistence.GenerationType;
> > import javax.persistence.Id;
> > import javax.persistence.NamedQuery;
> > import javax.persistence.OneToOne;
>
> > @Entity
> > public class ContentValue {
> >       �...@id
> >       �...@generatedvalue(strategy=GenerationType.IDENTITY)
> >       �...@extension(vendorName="datanucleus", key="gae.encoded-pk",
> > value="true")
> >        private String id;
>
> >   �...@enumerated
> >   �...@extension(vendorName="datanucleus", key="gae.parent-pk",
> > value="true")
> >    private String parentId;
>
> >   �...@enumerated
> >    private ContentValueType contentValueType;
>
> >   �...@enumerated
> >        private Blob content;
>
> >   �...@enumerated
> >    private String contentType;
>
> >        public void setId(String id) {
> >                this.id = id;
> >        }
>
> >        public String getId() {
> >                return id;
> >        }
>
> >        public void setParentId(String parentId) {
> >                this.parentId = parentId;
> >        }
>
> >        public String getParentId() {
> >                return parentId;
> >        }
>
> >        public void setContentValueType(ContentValueType contentValueType) {
> >                this.contentValueType = contentValueType;
> >        }
>
> >        public ContentValueType getContentValueType() {
> >                return contentValueType;
> >        }
>
> >        public void setContent(Blob content) {
> >                this.content = content;
> >        }
>
> >        public Blob getContent() {
> >                return content;
> >        }
>
> >        public void setContentType(String contentType) {
> >                this.contentType = contentType;
> >        }
>
> >        public String getContentType() {
> >                return contentType;
> >        }
> > }
>
> > ContentValueType.java
> > ---------------------
> > import java.io.Serializable;
>
> > package abc;
>
> > public enum ContentValueType implements Serializable {
> >        PICTURE,        // content is a picture
> >        THUMBNAIL,      // content is a thumbnail
> >        TAG_DATA        // tag data
> > }- 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 google-appengine-java@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