我在获取一个位于另一个对象内部的对象中的字段时遇到问题。我可以得到一些字段,但其他字段没有。
这是我为重现这个错误而创建的测试。
public void commentTest(){
try {
new MyUser("mauri@mail.com","Maurizio Pozzobon","01","facebook","hash").insert();
} catch (Exception e) {}
MyUser user = MyUser.findByEmail("mauri@mail.com");
Place place = new Place(user,"posto","bel posto",null,null);
place.insert();
assertNotNull(user);
Event e =new Event(user,place, "Festa","Questa è una gran bella festa",null,new Date(),(long) 10,false,null);
e.insert();
assertNotNull(user.nome);
EventComment ec = new EventComment(user, e, "TestComment", new Date());
ec.insert();
List<EventComment> ecs = e.comments.fetch();
for (EventComment comment : ecs) {
assertNotNull(comment.user.id);
MyUser us= MyUser.findById(comment.user.id);
assertNotNull(us.nome);
assertNotNull(comment.user.nome);
}
}
线路故障
assertNotNull(comment.user.nome);
这并不是一个破坏交易的因素,因为我仍然可以访问该字段,对DB进行其他调用,但似乎很奇怪,我可以访问一些字段,而其他字段不能
在MyUser中,我尝试声明带有和不带有以下注释的"nome"字段
@Column("nome")
@Max(200) @NotNull
public String nome;
基本上没有,这是正常的
你用GAE,对吗
在GAE中,请记住,没有SQL DB中的JOIN
获取注释时,不会完全获取链接的用户,只会填充user.id字段。这就是为什么assertNotNull(comment.user.id)
是可以的。
因此,默认情况下,如果您希望用户与注释关联,则需要手动获取该注释。
一旦我们将很快提供实体分组,以及一个新的注释@Join,它将自动获取链接的实体,这个限制应该会很快改变
您已经可以尝试此注释,但尚未最终确定。在你的评论类中,添加@Join:
@Join
@Column("user")
User user;
然后,当你获取一条评论时,它也会获取带有该评论的用户
Comment comment = Comment.findById("id", value);
assertNotNull(comment.user.nome); // will be OK.
但它不应该在这种情况下工作:List<EventComment> ecs = e.comments.fetch();
这种连接要复杂得多,在我们进行实体分组之前,它会消耗太多幕后资源。