Hi Max,

I have a tree structure using JDO, where each instance of the entity
has one parent and zero or more children. These relationships cannot
be performed by GAE/J currently due to outstanding bugs in self-
referential owned relationships.

So I model these relationships as unowned, using each entity's Long ID
as key. Each entity also has an entity group parent (in my example
below, the same instance of my class EntityGroupRoot). By using a
common entity group parent, one can ensure that all entities are in
the same entity group (if one wants that).

The drawback for the work-around is that the unowned parental and
child relationships have to be kept up to date manually by your app.

My example of a working persistent entity class follows.... Do let me
know if this helps you succeed.

Regards,

Ian



package [...];

import java.io.Serializable;
import java.util.ArrayList;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

@PersistenceCapable(identityType = IdentityType.APPLICATION,
 detachable = "true")
public class ItemCategory implements Serializable
{
  private static final long serialVersionUID = 1L;


  //////////////////////////////////////////////////////////////////////////////
  // This block is required since this entity has an entity group
root.
  // It does not work with MySQL, so we use an alternative for that
database.
  // We have the getter method for getting the encoded key here for
convenience.
  //

  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  @Extension(vendorName="datanucleus", key="gae.encoded-pk",
value="true")
  private String sEncodedKey;

  @Persistent
  @Extension(vendorName="datanucleus", key="gae.pk-id", value="true")
  private Long loID;

  public String getEncodedKey()
  {
    return sEncodedKey;
  }

  //
  //////////////////////////////////////////////////////////////////////////////


        /*
  //////////////////////////////////////////////////////////////////////////////
  // This block is required for testing with MySQL only, and will not
work
  // for Google BigTable.
  //

  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Long loID;

  //
  //////////////////////////////////////////////////////////////////////////////
        */


  @Persistent
  private EntityGroupRoot egrEntityGroupParent;

  @Persistent
  private Long loParentID;

  @Persistent
  private ArrayList<Long> liChildIDs = new ArrayList<Long>();

  @Persistent
  private String sName;

  @Persistent
  private Boolean bActive;


  //////////////////////////////////////////////////////////////////////////////
  // Getter methods (except getting the encoded key,
  // which is grouped with its field for convenience).
  //

  public Long getID()
  {
    return loID;
  }

  public EntityGroupRoot getEntityGroupParent()
  {
    return egrEntityGroupParent;
  }

  public Long getParentID()
  {
    return loParentID;
  }

  public ArrayList<Long> getChildIDs()
  {
    ArrayList<Long> alIDs = liChildIDs;

    if (alIDs == null)
      alIDs = new ArrayList<Long>();

    return alIDs;
  }

  public String getName()
  {
    return sName;
  }

  public boolean getActive()
  {
    boolean bResult = false;

    if ((bActive != null) && bActive.booleanValue())
      bResult = true;

    return bResult;
  }

  //
  //////////////////////////////////////////////////////////////////////////////


  //////////////////////////////////////////////////////////////////////////////
  // Setter methods
  //

  public void setEntityGroupParent(EntityGroupRoot entityGroupParent)
  {
    egrEntityGroupParent = entityGroupParent;
  }

  public void setParentID(Long parentID)
  {
    loParentID = parentID;
  }

  public void setChildIDs(ArrayList<Long> childIDs)
  {
    liChildIDs = childIDs;
  }

  public void setName(String name)
  {
    sName = name;
  }

  public void setActive(boolean active)
  {
    bActive = new Boolean(active);
  }

  //
  //////////////////////////////////////////////////////////////////////////////


  //////////////////////////////////////////////////////////////////////////////
  // Other methods
  //

  public void addChildID(Long loChildID)
  {
    if (liChildIDs == null)
      liChildIDs = new ArrayList<Long>();

    liChildIDs.add(loChildID);
  }

  //
  //////////////////////////////////////////////////////////////////////////////
}

--~--~---------~--~----~------------~-------~--~----~
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