我正在迈向Play的第一步!使用Java的框架(v2.1-rc1)现在我遇到了我的第一个ebean问题。我有一个导航实体,与自己有一个ManyToOne关系。一旦我尝试访问parentNavigation中的title字段,我就会收到以下错误:
[EntityNotFoundException: Bean has been deleted - lazy loading failed]
正如我发现的那样,只有在数据库中不存在父导航时才会出现错误。在这种情况下,我不应该收到一个空的导航对象吗?
导航实体:
package models;
import javax.persistence.*;
import play.db.ebean.*;
@Entity
public class Navigation extends Model {
@Id
public Long id;
@Column(name="c_title")
public String title;
@Column(name="id_parent")
public Long parentId;
@ManyToOne()
@JoinColumn(name="id_parent")
public Navigation parentNavigation;
public static Finder<Long,Navigation> find = new Finder<Long,Navigation>(
Long.class, Navigation.class
);
}
我在控制器中的动作:
public static Result index() {
Navigation navigation = Navigation.find.byId(2L); // this one doesn't work, but the entry with ID 30 does
return ok(views.html.app.index.render(navigation));
}
我的观点:
@(navigation: Navigation)
@main("Welcome to Play 2.0") {
This navigation: @navigation.title <br>
Parent: @navigation.parentNavigation.title
}
答案 0 :(得分:7)
如果我理解正确,您的parent_id
列包含2
(例如),但表中没有ID为2
的行。
如果是这样,那么获得异常是正常的。通过将所有不存在的parent_id
设置为NULL来清理数据,并将外键约束添加到parent_id
列,以便不再发生这种情况。
答案 1 :(得分:1)
一般来说,在尝试访问它之前检查关系是否为空总是更好:
This navigation: @navigation.title <br>
Parent: @if(navigation.parentNavigation != null){@navigation.parentNavigation.title} else {This nav has no parent}
当然,如果不需要,您可以跳过else
子句