Можно ли хранить коллекцию встроенных классов в 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 прямо не говорится, что это невозможно.