4

私はPlayで最初の一歩を踏み出しています!フレームワーク (v2.1-rc1) を Java で使用していますが、ebean で最初の問題に直面しました。それ自体に ManyToOne 関係を持つナビゲーション エンティティがあります。parentNavigation のタイトル フィールドにアクセスしようとすると、次のエラーが表示されます。

[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 

}
4

2 に答える 2

9

私が正しく理解していれば、列に(たとえば)parent_idを含む行がありますが、テーブルに ID を持つ行はありません。22

その場合、例外が発生するのは正常です。存在しないものをすべてparent_idNULL に設定してデータをクリーンアップし、列に外部キー制約を追加してparent_id、この状況が発生しないようにします。

于 2012-12-08T18:14:57.357 に答える
1

非常に一般的には、関係にアクセスする前に関係が null でないかどうかを常に確認することをお勧めします。

This navigation: @navigation.title <br>
Parent: @if(navigation.parentNavigation != null){@navigation.parentNavigation.title} else {This nav has no parent}

もちろん、else必要でない場合は句をスキップできます

于 2012-12-08T18:10:05.223 に答える