2014-03-28 45 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