2013-02-13 54 views
0

我的類層次如下 學校 - 包含員工列表 - 其中包含資質列表 員工是學校中的嵌入式列表。我可以堅持一個學校的員工沒有問題。現在,當我資格列表添加到僱員作爲嵌入式領域,我得到以下錯誤物體化嵌入式數組內的嵌入式數組無法持久

不能嵌套多個@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); 
     } 
    } 

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(在ofy3 @Embedded)
  • @Serialize(在ofy3 @Serialized)

如果你想要的東西序列化,使用第二。如果你想嵌入一些東西,請使用第一個。您不能嵌套@Embed(ded)列表,但可以在嵌入列表中放置@Serialize(d)列表。

+0

中的列表我已將我的代碼添加到OP。基本上,只要Employee類中沒有Qualifications列表,我就可以堅持一個學校對象,除此之外,我還會看到OP底部顯示的錯誤。我已經嘗試過使用和不使用嵌入註釋的員工資格列表。 – MayoMan 2013-02-13 06:20:26

+0

擺脫嵌入式註釋。它不適用於基元類型列表;嵌入的原因Objectify將類型視爲一個類(按字段分解)而不是原始類型。 – stickfigure 2013-02-13 18:55:38

+0

併爲了客觀化4它是@Serialize,對吧? – 2013-03-05 11:30:00

0

這上面標註有@Entity類的?聽起來學校是一個數據存儲實體,而員工不是(即他們只是序列化到學校)並且資格不是(即他們只是被序列化爲員工)。

@Embedded的Objectify註釋在非實體類中不需要/相關/允許。

+0

他們都是實體。我已經使用帶有@Entity註解的Employee來嘗試它,但沒有它。它似乎不喜歡子實體/類 – MayoMan 2013-02-13 06:26:16