0

我的班级层次结构如下 学校 - 包含员工列表 - 包含资格列表 员工是学校中的嵌入式列表。我可以用它的员工坚持一所学校没问题。现在,当我将资格列表作为嵌入字段添加到员工时,我收到以下错误

您不能嵌套多个 @Embedded 数组或集合

objectify 文档似乎表明我应该能够做到这一点,前提是对象是可序列化的。我错过了什么吗?如果这是它的工作方式,有没有办法解决它?

更新:

学校班

    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)
4

2 回答 2

1

有两种不同的注解:

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

如果您想序列化某些内容,请使用第二个。如果您想要嵌入某些东西,请使用第一个。您不能嵌套 @Embed(ded) 列表,但可以将 @Serialize(d) 列表放入嵌入列表中。

于 2013-02-13T05:16:29.550 回答
0

上面哪些类是用@Entity 注释的?听起来 School 是一个数据存储实体,而Employees 不是(即它们只是被序列化为 School),而资格不是(即它们只是被序列化为Employees)。

@Embedded 的 Objectify 注释在非实体类中是不需要/相关/允许的。

于 2013-02-13T01:29:05.397 回答