2013-02-13 3 views
0

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

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

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

Update:

Школа Класс

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); 
     } 
    } 

Класс 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) 

ответ

1

Есть два различных аннотаций:

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

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

+0

Я добавил свой код в OP. В принципе, я могу сохранить объект школьного объекта, пока класс Employee не имеет в нем списка квалификаций, иначе я получаю ошибку, показанную внизу OP. Я попробовал список квалификаций сотрудников с аннотацией Embedded и без нее. – MayoMan

+0

Избавьтесь от встроенной аннотации. Это не подходит для списков примитивных типов; Вложенные причины Объектизировать рассматривать тип как класс (разбивая его по полю) вместо примитивного типа. – stickfigure

+0

и для объективации 4 это @ Сериализовать, не так ли? –

0

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

Аннотации Objectify @Embedded не нужны/релевантно/разрешены в классе не Entity.

+0

Они оба сущности. Я попробовал это с Employee, имеющим аннотацию @Entity и без нее. Это просто не похоже на List в дочернем Entity/class – MayoMan

Смежные вопросы