¿Cuál es la forma apropiada de crear objetos con una relación de uno a muchos utilizando Objectify y SolicTory?

StackOverflow https://stackoverflow.com/questions/7815314

Pregunta

¿Cuál es la forma apropiada de crear objetos con una relación de uno a muchos utilizando Objectify y SolicTory? He leído documentación para estas bibliotecas, y también revisé el número de proyectos de muestra como listwidget y gwtgae2011. Todos ellos usan @Embedded Anotación que no es lo que quiero porque almacena todo dentro de una entidad. Otra opción según la documentación sería usar @Parent propiedad en clases de niños. En mi ejemplo (Getters/Setters eliminados por simplicidad) tengo entidades Person y Organization que definió como

@Entity
public class Person extends DatastoreObject
{
    private String name;
    private String phoneNumber;
    private String email;
    @Parent private Key<Organization> organizationKey;
}

y

@Entity
public class Organization extends DatastoreObject
{
    private String name;
    private List<Person> contactPeople;
    private String address;
}

Ahora, si entendí la documentación correctamente para persistir a la organización con una persona, primero tengo que persistir a la organización, entonces establezca organizationKey a ObjectifyService.factory().getKey(organization) para objeto de persona y luego persistirlo. Ya no me gusta que tenga que iterar a través de cada objeto infantil manualmente, pero el uso de requestFactory hace que todo esté más complicado debido a la presencia de clases de proxy. ¿Cómo definiría las clases de organización y organización, con clave <> o sin ella? ¿Tendré que definir algo como esto en la organización?

public void setContactPeople(List<Person> contactPeople)
{
    for (int i = 0; i < contactPeople.size(); ++i)
    {
        DAOBase dao = new DAOBase();
        Key<Organization> key = dao.ofy().put(this);
        contactPeople.get(i).setOrganizationKey(key);
    }
    this.contactPeople = contactPeople;
}

¿Y cómo cargaría la organización con sus hijos desde DataStore? ¿Tendré que buscar manualmente a todas las personas y completar la organización? @PostLoad método ?

Parece que tendré que escribir mucho código de mantenimiento solo para hacer lo que JPA/JDO hace detrás de la escena. Simplemente no lo entiendo :(

¿Me estoy perdiendo algo o es la única forma de implementarlo?

Muchas gracias por las respuestas de antemano !!!

¿Fue útil?

Solución

Necesitas hacerlo como @Parent solo cuando lo usas en transacción contra todos Person en esto Organization. Estoy seguro de que no es lo que quieres.

Es suficiente para salvar solo private Key<Organization> organizationKey, y filtrar por este campo cuando necesite encontrar Person para especificado Organization

Como sobre la carga de todos los objetos referenciados, sí, es así, debe cargarlo manualmente. Es Pita, pero no es mucho código.

Además, hay una forma diferente de almacenar esta relación, si su organización es lo suficientemente pequeña y consta de pocos cientos de personas. En este caso puedes tener List<Key<Person>> contactPeopleKey;, y cargue a todas estas personas por existir Key, manualmente, es mucho más rápido que cargar por una nueva consulta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top