2014-03-28 48 views
0

我正在嘗試重構一些數據模型,但遇到了一個我不明白的問題。使用ObjectifyService.register時出現AssertionError

我原本由3個實體類的簡單的數據模型,它看起來是這樣的:

@Entity 
public final class Teacher { 
    @Id 
    private Long id; 
    private String primarySubject; 

    public Teacher() {} 

    public Teacher(String primarySubject) { 
    this.primarySubject = primarySubject; 
    } 

    //getters & setters 
} 

@Entity 
public final class Student { 
    @Id 
    private String username; 
    @Load 
    @Index 
    private Ref<Teacher> homeRoomTeacher; 

    public Student() {} 

    public Student(String username, Teacher teacher) { 
    this.username = username; 
    homeRoomTeacher = Ref.create(teacher); 
    } 

    //getters & setters 
} 

@Entity 
public final class School { 
    @Id 
    private String name; 
    @Load 
    private Set<Ref<Teacher>> teachers; 
    @Load 
    private Set<Ref<Student>> students; 

    public School() {} 

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

    //getters & setters 
} 

而這一切工作的罰款。

但我們決定,這將是更有益的事情嵌入的實體,而不是直接的參考文獻......

@Entity 
@Embed 
public final class Teacher { 
    @Id 
    private Long id; 
    private String primarySubject; 

    public Teacher() {} 

    public Teacher(String primarySubject) { 
    this.primarySubject = primarySubject; 
    } 

    //getters & setters 
} 

@Entity 
@Embed 
public final class Student { 
    @Id 
    private String username; 
    @Index 
    private Ref<Teacher> homeRoomTeacher; 

    public Student() {} 

    public Student(String username, Teacher teacher) { 
    this.username = username; 
    homeRoomTeacher = Ref.create(teacher); 
    } 

    //getters & setters 
} 

@Entity 
public final class School { 
    @Id 
    private String name; 
    private Set<Teacher> teachers; 
    private Set<Student> students; 

    public School() {} 

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

    //getters & setters 
} 

做出這些改變,那麼我們所有的JUnit測試後開始失敗,一個AssertionError在我們的測試設置方法,其看起來像學校類的註冊期間:

@Before 
    public void setUp() throws Exception { 
    helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()); 
    helper.setUp(); 
    ObjectifyService.register(Teacher.class); 
    ObjectifyService.register(Student.class); 
    ObjectifyService.register(School.class); 

    // more setup 
    } 

的AssertionError的不出現,直到註冊學校類的線,並根據所述堆棧跟蹤正在從方法拋出「 com.googlecode.objectify.impl.translate.CreateContext.enterCollection「,但我不確定如何去修復它。

有沒有人有任何想法?

回答

0

我懷疑你得到的錯誤是你試圖註冊一個你已經用@Embed註解的類。

對象化文檔明確指出@Embed類不必註冊 - 也許這是問題的原因。

此外,我不是100%確定這一點,但我不認爲你需要@Id嵌入類。

我建議你給以下更改一展身手:

@Embed 
public final class Teacher { 
    @Id 
    private Long id; 
    private String primarySubject; 

    public Teacher() {} 

    public Teacher(String primarySubject) { 
    this.primarySubject = primarySubject; 
    } 

    //getters & setters 
} 

@Embed 
public final class Student { 
    @Id 
    private String username; 
    @Index 
    private Ref<Teacher> homeRoomTeacher; 

    public Student() {} 

    public Student(String username, Teacher teacher) { 
    this.username = username; 
    homeRoomTeacher = Ref.create(teacher); 
    } 

    //getters & setters 
} 

@Before 
public void setUp() throws Exception 
{ 
    helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig()); 
    helper.setUp(); 
    ObjectifyService.register(School.class); 

    // more setup 
} 

希望這有助於!

+0

感謝您的建議,實際上我在週末做出了很大的改變,但在註冊學校課程時我仍然得到同樣的錯誤。順便說一下,我會注意到,使用我的初始設置,錯誤不會發生在學生或教師課程的註冊上(如果@Embed註釋有問題,您會期望),但僅限於學校類。 – klactose