How to query parent entity from child entity in Google App Engine(Java) Datastore?

4 views
Skip to first unread message

user3607917 via StackOverflow

unread,
May 6, 2014, 8:13:03 AM5/6/14
to google-appengin...@googlegroups.com

I have created Owned One-to-Many Relationships between Department and Employee using JPA annotation. Entities are:

Department(Parent)
    String Id
    String Name
    List Employee(@OneToMany) 

Employee(Child)
    Key key
    String firstName
    String lastName
    String Address
    Department dept(@ManyToOne)

When Employee's firstName is entered I want to display that Employee detail(lastName and address) and also from which Department he Belongs. i did not find any solution to get the parent info from child Entity. Is there any way to get the information about parent entity from its child entity ?

I think one possible solution is to get the parent id from child and in another query get the Parent Detail. but i want all the information about employee in single query. is this possible?

here is my code.

Department Entity:
    @Entity
    public class Department {

          @Id
          private String id;

          private String description;

          @OneToMany(mappedBy = "department", fetch=FetchType.EAGER, cascade = CascadeType.ALL)
          private List<Employee> employee = new ArrayList<Employee>();

          public String getId() {
              return id;
          }

          public void setId(String id) {
              this.id = id;
          }

          public String getDescription() {
            return description;
          }

          public void setDescription(String description) {
            this.description = description;
          }

          public List<Employee> getEmployee () {
                return employee ;
          }

          public void setEmployee (List<Employee > employee) {
                this.employee = employee ;
          }
    }

Employee Entity:
    @Entity
    public class Employee {
             @Id
             @GeneratedValue(strategy = GenerationType.IDENTITY)
             private Key key;

             private String firstName;
             private String lastName;
             private String Address;

             private String parent_Id;

             @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
             private Department department;

             public Key getKey() {
            return key;
             }

             public String getFirstName() {
                 return firstName;
             }

             public void setFirstName(String firstName) {
                 this.firstName = firstName;
             }

             public String getLastName() {
                 return lastName;
             }

             public void setLastName(String lastName) {
                 this.lastName = lastName;
             }

             public String getAddress() {
                return Address;
             }

             public void setAddress(String Address) {
                this.Address = Address;
             }
    }

Android Code to insert Entity in Background

Departmentendpoint.Builder builder1 = new                                          Departmentendpoint.Builder(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), null);
Departmentendpoint dptendpoint = CloudEndpointUtils.updateBuilder(builder1).build();

    Department dpt = new Department();
    dpt.setDescription("Water Service"); 
    List<Employee> m = new ArrayList<Employee>();       
    Employee mgr2= new Employee();
    mgr2.setFirstName("Avinash"+i);
    mgr2.setLastName("Patel"+i);
    mgr2.setAddress("Vadodara");
    m.add(mgr2);    
    dpt.setEmployee(m);

    try {
        dptendpoint.insertDepartment(dpt).execute();
    } catch (IOException e) {
        e.printStackTrace();
    }


Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/23494323/how-to-query-parent-entity-from-child-entity-in-google-app-enginejava-datastor

Andrei Volgin via StackOverflow

unread,
May 6, 2014, 10:43:08 AM5/6/14
to google-appengin...@googlegroups.com

You can get a parent id from a child entity's key, but you have to get the parent entity from the datastore.

You can store a department name in every employee entity, which will save you one get operation at the expense of extra data and more complex code (you have to account for situations like a change in a department name).

A better solution is to keep department entities in memcache. This way you save a trip to the datastore and keep your data model and code simple.



Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/23494323/how-to-query-parent-entity-from-child-entity-in-google-app-enginejava-datastor/23497820#23497820

xybrek via StackOverflow

unread,
May 7, 2014, 12:28:37 AM5/7/14
to google-appengin...@googlegroups.com

The basic idea with Entity relationship with GAE Datastore is:

A child entity must have a key with parent set to a given parent Enitty like:

Entity parent = createParentEntity();
Enttity child = new Entity(KeyFactory.createKey(parent.getKey, kind, key));

A parent entity must have the child Entity key as its property:

Entity parent = createParentEntity();
Entity child = createChildEnity();

parent.setProperty("fieldName", child.getKey());

This way you can retrieve the parent from the child Entity or you can fetch the child from the parent entity. Hope this helps.



Please DO NOT REPLY directly to this email but go to StackOverflow:
http://stackoverflow.com/questions/23494323/how-to-query-parent-entity-from-child-entity-in-google-app-enginejava-datastor/23508705#23508705
Reply all
Reply to author
Forward
0 new messages