Как аннотировать набор встроенных объектов в Google App Engine (Java)?

Можно ли хранить коллекцию встроенных классов в Google App Engine (Java)? Если да, то как бы я это прокомментировал?

Это мой класс:

@PersistenceCapable
public class Employee
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Key key;

    @Persistent(embeddedElement = "true")
    private List<ContactInfo> contactDetails = new ArrayList<ContactInfo>();

    public void addContactInfo(String streetAddress, String city)
    {
        this.contactDetails.add(new ContactInfo(streetAddress, city));
    }

    public List<ContactInfo> getContactDetails()
    {
        return this.contactDetails;
    }

    @PersistenceCapable
    @EmbeddedOnly
    public static class ContactInfo
    {
        @Persistent
        private String streetAddress;

        @Persistent
        private String city;

        public ContactInfo(String streetAddress, String city)
        {
            this.streetAddress = streetAddress;
            this.city = city;
        }

        public String getStreetAddress()
        {
            return this.streetAddress;
        }

        public String getCity()
        {
            return this.city;
        }
    }
}

Вот тестовый код:

// Create the employee object

Employee emp = new Employee();

// Add some contact details

emp.addContactInfo("123 Main Street", "Some City");
emp.addContactInfo("50 Blah Street", "Testville");

// Store the employee

PersistenceManager pm = PMF.get().getPersistenceManager();

try
{
    pm.makePersistent(emp);
} 
finally
{
    pm.close();
}

// Query the datastore for all employee objects

pm = PMF.get().getPersistenceManager();

Query query = pm.newQuery(Employee.class);

try
{
    List<Employee> employees = (List<Employee>) query.execute();

    // Iterate the employees

    for(Employee fetchedEmployee : employees)
    {
        // Output their contact details

        resp.getWriter().println(fetchedEmployee.getContactDetails());
    }
}
finally
{
    query.closeAll();
    pm.close();
}

Код теста всегда выводит 'null'. Какие-либо предложения?

Я попытался аннотировать список contactDetails как @Embedded, но усилитель DataNucleus выдал исключение. Я также попытался добавить defaultFetchGroup = "true" в аннотацию @Persistent в списке contactDetails (на случай, если возникла проблема с получением данных), но результат все еще был нулевым. Я изучил объект сотрудника в консоли и не обнаружил никаких свидетельств того, что какие-либо поля сведений о контактах хранятся в объекте, а также нет каких-либо автономных объектов ContactInfo в хранилище данных (не то, чтобы я ожидал, что они будут, учитывая, что они встроенные объекты).

Это вообще возможно сделать? Я знаю, что поля встроенного класса хранятся как свойства объекта, поэтому я вижу, как могут возникать конфликты имен полей в сценарии коллекции, но документах App Engine прямо не говорится, что это невозможно.


person Cameron    schedule 23.09.2010    source источник


Ответы (2)


Я не знаю, нужен ли вам ответ, но добавление списка в defaultFetchGroup решило эту проблему для меня:

@PersistenceCapable
public class Employee
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    Key key;

    @Persistent(embeddedElement = "true", defaultFetchGroup = "true")
    private List<ContactInfo> contactDetails = new ArrayList<ContactInfo>();

    // Snip...

}
person johnhaley81    schedule 17.08.2011

С JDO вы должны сделать это в соответствии с документацией DataNucleus http://www.datanucleus.org/products/accessplatform_2_2/jdo/orm/embedded.html#Collection В примере показан XML, но имена аннотаций примерно эквивалентны.

Поддерживает ли это плагин GAE/J, я не могу сказать, так как за это отвечает Google. Может, попробовать?

person DataNucleus    schedule 23.09.2010