Объективировать встроенный массив внутри встроенного массива не может сохраняться

Иерархия моего класса выглядит следующим образом. Школа - содержит список сотрудников, который содержит список квалификаций. Сотрудники - это встроенный список в школе. Я могу сохранить школу с ее сотрудниками без проблем. Теперь, когда я добавляю список квалификаций сотруднику в качестве встроенного поля, я получаю следующую ошибку

Вы не можете вкладывать несколько массивов или коллекций @Embedded

Документация по объективизации, похоже, указывает, что я должен быть в состоянии сделать это при условии, что объекты сериализуемы, каковыми они и являются. Я что-то упускаю? Если это так, как это работает, есть ли способ обойти это?

Обновлять:

Школьный класс

    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import javax.persistence.Embedded;
    import javax.persistence.Id;
    import com.googlecode.objectify.annotation.Entity;

    @Entity
    @SuppressWarnings("serial") 
    public class School implements Serializable
    {
        @Id
        private String title;

        @Embedded
        private List<Employee> employees = new ArrayList<Employee>();

        public School ()
        {       
        }
        public School (String title)
        {       
            this.title = title;
        }

        public void addEmployee( Employee employee )
        {
            this.employees.add(employee);
        }
    }

Класс сотрудника

    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import javax.persistence.Embedded;
    import javax.persistence.Id;
    import com.googlecode.objectify.annotation.Entity;

    @Entity
    @SuppressWarnings("serial") 
    public class Employee implements Serializable
    {
        @Id
        private String title;

        @Embedded
        private List<String> qualifications = new ArrayList<String>();

        public Employee ()
        {       
        }
        public Employee (String title)
        {       
            this.title = title;
        }

        public void addQualification( String qualification )
        {
            this.qualifications.add(qualification);
        }
    }
Caused by: java.lang.IllegalStateException: You cannot nest multiple @Embedded arrays or collections. A second was found at private java.util.List com.app.nquizitive.shared.Employee.qualifications
at com.googlecode.objectify.impl.save.EmbeddedMultivalueFieldSaver.<init>(EmbeddedMultivalueFieldSaver.java:36)
at com.googlecode.objectify.impl.save.EmbeddedCollectionFieldSaver.<init>(EmbeddedCollectionFieldSaver.java:21)
at com.googlecode.objectify.impl.save.ClassSaver.<init>(ClassSaver.java:64)
at com.googlecode.objectify.impl.save.EmbeddedMultivalueFieldSaver.<init>(EmbeddedMultivalueFieldSaver.java:43)
at com.googlecode.objectify.impl.save.EmbeddedCollectionFieldSaver.<init>(EmbeddedCollectionFieldSaver.java:21)
at com.googlecode.objectify.impl.save.ClassSaver.<init>(ClassSaver.java:64)
at com.googlecode.objectify.impl.save.ClassSaver.<init>(ClassSaver.java:29)
at com.googlecode.objectify.impl.Transmog.<init>(Transmog.java:322)
at com.googlecode.objectify.impl.ConcreteEntityMetadata.<init>(ConcreteEntityMetadata.java:75)
at com.googlecode.objectify.impl.Registrar.register(Registrar.java:69)
at com.googlecode.objectify.ObjectifyFactory.register(ObjectifyFactory.java:209)
at com.googlecode.objectify.ObjectifyService.register(ObjectifyService.java:38)
at com.app.nquizitive.server.dao.SchoolDao.<clinit>(SchoolDao.java:12)

person MayoMan    schedule 13.02.2013    source источник


Ответы (2)


Есть две разные аннотации:

  • @Embed (@Embedded в ofy3)
  • @Serialize (@Serialized в ofy3)

Если вы хотите что-то сериализовать, используйте второй. Если вы хотите что-то встроенное, используйте первое. Вы не можете вкладывать списки @Embed(ded), но вы можете поместить список @Serialize(d) во встроенный список.

person stickfigure    schedule 13.02.2013
comment
Я добавил свой код в OP. По сути, я могу сохранять школьный объект в порядке, если в классе Employee нет списка квалификаций, в противном случае я получаю сообщение об ошибке, показанное в нижней части OP. Я пробовал список квалификации сотрудников с встроенной аннотацией и без нее. - person MayoMan; 13.02.2013
comment
Избавьтесь от встроенной аннотации. Это не подходит для списков примитивных типов; Embedded заставляет Objectify рассматривать тип как класс (разбивая его по полю), а не как примитивный тип. - person stickfigure; 13.02.2013

Какие из перечисленных выше классов аннотированы @Entity? Похоже, что школа является объектом хранилища данных, а сотрудники — нет (т. е. они просто сериализуются в школу), а квалификации — нет (т. е. они просто сериализуются в сотрудников).

Аннотация Objectify для @Embedded не требуется/уместна/разрешена в классе, отличном от Entity.

person jeffrey_t_b    schedule 13.02.2013
comment
Они оба сущности. Я пробовал это с сотрудником, имеющим аннотацию @Entity, и без нее. Ему просто не нравится список в дочернем объекте/классе - person MayoMan; 13.02.2013